diff --git a/DEPS b/DEPS index e23d33993711ee..69751acbfd1fd0 100644 --- a/DEPS +++ b/DEPS @@ -245,15 +245,15 @@ vars = { # 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': '44a83926207668ad8de5eae74d68a54812ca55ad', + 'skia_revision': '20981e308a4b7a96931b3749645c125d17c4e998', # 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': 'f5e412a1cd82fb606b79a587f1c4bda7f9445701', + 'v8_revision': 'a943800464aa4c5238af46945807949fcfb3e370', # 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': '543f5750f70e014dc9c2217fb2fcf1c6b63badd5', + 'angle_revision': 'b9f2d9cc145520e7961acfd70077e91b9f03d2c1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -312,7 +312,7 @@ vars = { # 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': 'd6ef4a8af654ca24f8adca2a892f6f7857d57d2f', + 'catapult_revision': '22e558b5843a77389ca3883d0950f0f34e6f690c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -360,11 +360,11 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '3649af2486cd1c805f364a54cdf127179330024a', + 'dawn_revision': 'fc38f7d87901b200c3af3d4c90d3f2f43e2d2ff5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '66b78407d91da2836206ee9ef904db81ecdc3694', + 'quiche_revision': 'ed970f7c38381309e9306982efa8dcfac1201269', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -838,7 +838,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/aapt2', - 'version': 'GlCdqxHxlg-8YkDGgj5cie-6COsEAZga9jyq-LAYxY4C', + 'version': 'ZHiDoiurxMLwajQq_CwBH9zaDW5xwYWYGbedxIslTm8C', }, ], 'condition': 'checkout_android', @@ -1410,7 +1410,7 @@ deps = { Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b52786888ddce9d6bc06b7825ba9bffc65924e0c', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '8620ec89411da06662dfd920ba4e45b999269a77', + Var('chromium_git') + '/openscreen' + '@' + '499acfd929759f895539e717316bffa7525269b6', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + 'bf21ccb1007bb531b45d9978919a56ea5059c245', @@ -1730,7 +1730,7 @@ deps = { Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6b2cb689b53fd43f282594b87295a1ebcf675b0b', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c2192b8adaaef9fc4e1e51809e9b10599e0cf78d', 'condition': 'checkout_src_internal', }, diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 8719724aa9a9b0..a013d755bdf4af 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc @@ -859,8 +859,12 @@ void AppListControllerImpl::OnTabletModeEnded() { } void AppListControllerImpl::OnWallpaperColorsChanged() { - if (IsVisible(last_visible_display_id_)) - fullscreen_presenter_->GetView()->OnWallpaperColorsChanged(); + // Clamshell ProductivityLauncher doesn't use wallpaper prominent color. + if (IsVisible(last_visible_display_id_) && !ShouldShowAppListBubble()) { + AppListView* app_list_view = fullscreen_presenter_->GetView(); + DCHECK(app_list_view); + app_list_view->OnWallpaperColorsChanged(); + } } void AppListControllerImpl::OnWallpaperPreviewStarted() { diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc index 057bde9cd327a2..5cecc6a3506102 100644 --- a/ash/app_list/app_list_controller_impl_unittest.cc +++ b/ash/app_list/app_list_controller_impl_unittest.cc @@ -1281,6 +1281,15 @@ TEST_F(AppListControllerImplAppListBubbleTest, EnteringTabletModeClosesBubble) { EXPECT_FALSE(controller->bubble_presenter_for_test()->IsShowing()); } +TEST_F(AppListControllerImplAppListBubbleTest, + WallpaperColorChangeDoesNotCrash) { + auto* controller = Shell::Get()->app_list_controller(); + controller->ShowAppList(); + // Simulate synced wallpaper update while bubble is open. + controller->OnWallpaperColorsChanged(); + // No crash. +} + class AppListControllerWithAssistantTest : public AppListControllerImplTest { public: AppListControllerWithAssistantTest() diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 305f29d7001d7a..790b567a7908ec 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc @@ -135,8 +135,10 @@ constexpr int kContinueColumnCount = 4; // The vertical spacing between recent apps and continue section view. constexpr int kRecentAppsTopMargin = 16; -// The vertical spacing above and below the separator. -constexpr int kSeparatorVerticalInset = 16; +// The vertical spacing above and below the separator when using kRegular/kDense +// AppListConfigType. +constexpr int kRegularSeparatorVerticalInset = 16; +constexpr int kDenseSeparatorVerticalInset = 8; // The width of the separator. constexpr int kSeparatorWidth = 240; @@ -285,8 +287,10 @@ class AppsContainerView::ContinueContainer : public views::View { ColorProvider::ContentLayerType::kSeparatorColor)); separator_->SetPreferredSize( gfx::Size(kSeparatorWidth, views::Separator::kThickness)); + // Initially set the vertical inset to kRegularSeparatorVerticalInset. The + // value will be updated in `AppsContainerView::UpdateAppListConfig()` separator_->SetProperty(views::kMarginsKey, - gfx::Insets(kSeparatorVerticalInset, 0)); + gfx::Insets(kRegularSeparatorVerticalInset, 0)); separator_->SetPaintToLayer(); separator_->layer()->SetFillsBoundsOpaquely(false); separator_->SetProperty(views::kCrossAxisAlignmentKey, @@ -315,6 +319,18 @@ class AppsContainerView::ContinueContainer : public views::View { return recent_apps_ && recent_apps_->GetVisible(); } + void UpdateAppListConfig(AppListConfig* config) { + if (recent_apps_) + recent_apps_->UpdateAppListConfig(config); + + const int separator_vertical_inset = + config->type() == AppListConfigType::kRegular + ? kRegularSeparatorVerticalInset + : kDenseSeparatorVerticalInset; + separator_->SetProperty(views::kMarginsKey, + gfx::Insets(separator_vertical_inset, 0)); + } + ContinueSectionView* continue_section() { return continue_section_; } RecentAppsView* recent_apps() { return recent_apps_; } views::View* separator() { return separator_; } @@ -494,8 +510,8 @@ void AppsContainerView::UpdateAppListConfig(const gfx::Rect& contents_bounds) { apps_grid_view()->UpdateAppListConfig(app_list_config_.get()); app_list_folder_view()->UpdateAppListConfig(app_list_config_.get()); - if (GetRecentApps()) - GetRecentApps()->UpdateAppListConfig(app_list_config_.get()); + if (continue_container_) + continue_container_->UpdateAppListConfig(app_list_config_.get()); } void AppsContainerView::OnActiveAppListModelsChanged( diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index f5f1ef2c9121d6..2ee1a58811c702 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd @@ -3365,11 +3365,15 @@ This file contains the strings for ash. Calendar - + + Calendar, $1August 2021, currently $2August 31, 2021 is selected. + + + Show previous month - + Show next month @@ -3381,10 +3385,38 @@ This file contains the strings for ash. Today + + Go back to today + + Open settings + + Date and time settings + + + + Close event panel + + + + Close detail information + + + + $1August 31, 2021, $20 event + + + + $1August 31, 2021, $28 events + + + + Calendar, week of $1July 16th 2021,, $218 is currently selected. + + M diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_CONTENT_ACCESSIBLE_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_CONTENT_ACCESSIBLE_DESCRIPTION.png.sha1 new file mode 100644 index 00000000000000..7504db64c01694 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_CONTENT_ACCESSIBLE_DESCRIPTION.png.sha1 @@ -0,0 +1 @@ +d409abf28cdab9afe8988ab7505df0a602159c40 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_DATE_CELL_PLURAL_EVENTS_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_DATE_CELL_PLURAL_EVENTS_TOOLTIP.png.sha1 new file mode 100644 index 00000000000000..495bba114e11a5 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_DATE_CELL_PLURAL_EVENTS_TOOLTIP.png.sha1 @@ -0,0 +1 @@ +0108793efa5647fb8f96ee91f78362e134d9e236 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_DATE_CELL_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_DATE_CELL_TOOLTIP.png.sha1 new file mode 100644 index 00000000000000..47d1edce07a2d0 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_DATE_CELL_TOOLTIP.png.sha1 @@ -0,0 +1 @@ +e6464fa8ee4d49be97ff35c31ac1f49f5e6786ca \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_SELECTED_DATE_CELL_ACCESSIBLE_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_SELECTED_DATE_CELL_ACCESSIBLE_DESCRIPTION.png.sha1 new file mode 100644 index 00000000000000..34473492b59bc0 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_SELECTED_DATE_CELL_ACCESSIBLE_DESCRIPTION.png.sha1 @@ -0,0 +1 @@ +2c2017b5f606bd817d702f21d6fa7d36a322f81d \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_SETTINGS_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_SETTINGS_TOOLTIP.png.sha1 new file mode 100644 index 00000000000000..d98d76a252456b --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_SETTINGS_TOOLTIP.png.sha1 @@ -0,0 +1 @@ +f713c942aa78d6ed63f09bc940f7cd24c5a70cfa \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDA_TODAY_BUTTON_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDA_TODAY_BUTTON_TOOLTIP.png.sha1 new file mode 100644 index 00000000000000..b1754d9ae7415c --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDA_TODAY_BUTTON_TOOLTIP.png.sha1 @@ -0,0 +1 @@ +90a221cc84429ec7090ec7bd69a147f8887cfc5c \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CLOSE_BUTTON_ACCESSIBLE_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CLOSE_BUTTON_ACCESSIBLE_DESCRIPTION.png.sha1 new file mode 100644 index 00000000000000..71035675a5f122 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CLOSE_BUTTON_ACCESSIBLE_DESCRIPTION.png.sha1 @@ -0,0 +1 @@ +7334a10e6e9c50bebe5c2119da8c2a75f77420e1 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_CLOSE_BUTTON_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CLOSE_BUTTON_TOOLTIP.png.sha1 new file mode 100644 index 00000000000000..6b19d0e20fc0c5 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CLOSE_BUTTON_TOOLTIP.png.sha1 @@ -0,0 +1 @@ +a2d7d8eb7f42ed2880043230d6ee02ba4a8e5055 \ No newline at end of file diff --git a/ash/components/arc/arc_features.cc b/ash/components/arc/arc_features.cc index d56db156f0cfe9..546f7b549a642b 100644 --- a/ash/components/arc/arc_features.cc +++ b/ash/components/arc/arc_features.cc @@ -161,7 +161,7 @@ const base::Feature kUseDefaultBlockSize{"ArcVmUseDefaultBlockSize", // to delegate decoding tasks to VideoDecoder implementations, instead of using // VDA implementations created by GpuVideoDecodeAcceleratorFactory. const base::Feature kVideoDecoder{"ArcVideoDecoder", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Controls whether a custom memory size is used when creating ARCVM. When // enabled, ARCVM is sized with the following formula: diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc index e87c5e63d31343..71b1f38e54b7be 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc @@ -27,6 +27,8 @@ const char kRetroactivePairingResultMetric[] = "Bluetooth.ChromeOS.FastPair.RetroactivePairing.Result"; const char kTotalGattConnectionTimeMetric[] = "Bluetooth.ChromeOS.FastPair.TotalGattConnectionTime"; +const char kGattConnectionResult[] = + "Bluetooth.ChromeOS.FastPair.GattConnection.Result"; const char kFastPairPairFailureInitialMetric[] = "Bluetooth.ChromeOS.FastPair.PairFailure.InitialPairingProtocol"; const char kFastPairPairFailureSubsequentMetric[] = @@ -119,6 +121,10 @@ void RecordTotalGattConnectionTime(base::TimeDelta total_gatt_connection_time) { total_gatt_connection_time); } +void RecordGattConnectionResult(bool success) { + base::UmaHistogramBoolean(kGattConnectionResult, success); +} + void RecordPairingResult(const Device& device, bool success) { switch (device.protocol) { case Protocol::kFastPairInitial: diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h index 3989b4e81039ef..c637d4c2a3f2dc 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h @@ -81,6 +81,9 @@ void RecordRetroactivePairingResult(bool success); COMPONENT_EXPORT(QUICK_PAIR_COMMON) void RecordTotalGattConnectionTime(base::TimeDelta total_gatt_connection_time); +COMPONENT_EXPORT(QUICK_PAIR_COMMON) +void RecordGattConnectionResult(bool success); + COMPONENT_EXPORT(QUICK_PAIR_COMMON) void RecordPairingFailureReason(const Device& device, PairFailure failure); 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 d68674c8f91435..1d1aeaa4596454 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 @@ -125,6 +125,8 @@ FastPairGattServiceClientImpl::~FastPairGattServiceClientImpl() = default; void FastPairGattServiceClientImpl::OnGattConnection( std::unique_ptr gatt_connection, absl::optional error_code) { + RecordGattConnectionResult(/*success=*/!error_code.has_value()); + if (error_code) { QP_LOG(WARNING) << "Error creating GATT connection to device due to error: " << error_code.value(); diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc index 81842b062cc28d..4caaf651e845d0 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc @@ -40,6 +40,8 @@ using ErrorCallback = const char kTotalGattConnectionTime[] = "Bluetooth.ChromeOS.FastPair.TotalGattConnectionTime"; +const char kGattConnectionResult[] = + "Bluetooth.ChromeOS.FastPair.GattConnection.Result"; constexpr base::TimeDelta kConnectingTestTimeout = base::Seconds(5); @@ -537,6 +539,7 @@ class FastPairGattServiceClientTest : public testing::Test { TEST_F(FastPairGattServiceClientTest, GattServiceDiscoveryTimeout) { histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 0); SuccessfulGattConnectionSetUp(); FastForwardTimeByConnetingTimeout(); NotifyGattDiscoveryCompleteForService(); @@ -544,21 +547,26 @@ TEST_F(FastPairGattServiceClientTest, GattServiceDiscoveryTimeout) { PairFailure::kGattServiceDiscoveryTimeout); EXPECT_FALSE(ServiceIsSet()); histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 1); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 1); } TEST_F(FastPairGattServiceClientTest, FailedGattConnection) { histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 0); FailedGattConnectionSetUp(); EXPECT_EQ(GetInitializedCallbackResult(), PairFailure::kCreateGattConnection); EXPECT_FALSE(ServiceIsSet()); histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 1); } TEST_F(FastPairGattServiceClientTest, GattConnectionSuccess) { histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 0); SuccessfulGattConnectionSetUp(); NotifyGattDiscoveryCompleteForService(); histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 1); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 1); } TEST_F(FastPairGattServiceClientTest, IgnoreNonFastPairServices) { diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 183c851f12b58d..b00c8b7b1d6514 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb @@ -624,6 +624,7 @@ Alle gebruikers moet afmeld om voort te gaan. Begin onderskrifte Verkeerde PIN Ontsluit meer Assistent-kenmerke. +Personaliseer Wys volgende maand Ander sleutelbord is gekoppel Ontsluit diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index da82316a8c064c..e110e605d267f5 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb @@ -623,6 +623,7 @@ Паказаць субцітры Няправільны PIN-код Адкрыйце больш функцый Памочніка. +Персаналізаваць Паказаць наступны месяц Падключана іншая клавіятура Прылада разблакіравана diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 861d9186bcd0c7..6b192fe9e07ad3 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb @@ -623,6 +623,7 @@ Pro začátek můžete vyzkoušet třeba tohle. Zapnout skryté titulky Nesprávný kód PIN Odemkněte další funkce Asistenta. +Personalizace Zobrazit další měsíc Je připojena jiná klávesnice Odemknuto diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 2a1b9df0c3d30a..1ab44ecfa093e4 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb @@ -623,6 +623,7 @@ Her er nogle af de ting, du kan prøve for at komme godt i gang. Start undertekster Forkert pinkode Få adgang til endnu flere Assistent-funktioner. +Tilpas Vis næste måned Du har tilsluttet et andet tastatur Låst op diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index c37ff51cb4e11c..79accde1c4576f 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb @@ -623,6 +623,7 @@ Hier sind ein paar Dinge, die du tun kannst, um loszulegen. Untertitel verwenden Falsche PIN Möchten Sie weitere Assistant-Funktionen freischalten? +Personalisieren Nächsten Monat anzeigen Andere Tastatur angeschlossen Entsperrt diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 9e81567e7667cb..fe4811429938ad 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb @@ -624,6 +624,7 @@ Todos los usuarios deben salir de sus cuentas para continuar. Activar subtítulos Número de PIN incorrecto Desbloquea más funciones del Asistente. +Personalizar Mostrar el mes siguiente Se conectó otro teclado Desbloqueada diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index cd891d99268a2b..b4567034a78aeb 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb @@ -624,6 +624,7 @@ Todos los usuarios deben cerrar sesión para continuar. Iniciar subtítulos PIN incorrecto Descubre más funciones del Asistente. +Personalizar Mostrar mes siguiente Se ha conectado otro teclado Desbloqueado diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 77d8ce112a51d7..f3b34041a23b1e 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb @@ -624,6 +624,7 @@ Jätkamiseks peavad kõik kasutajad välja logima. Alusta subtiitrite kasutamist Vale PIN-kood Avage rohkem assistendi funktsioone. +Isikupärastamine Järgmise kuu kuvamine Ühendatud on teine klaviatuur Avatud diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 6ee0fb8f1b14f3..502d6b89842bc6 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb @@ -623,6 +623,7 @@ Pääset alkuun esimerkiksi näillä tavoilla. Käynnistä tekstitykset Väärä PIN-koodi Käytä lisää Assistantin ominaisuuksia. +Personoi Näytä seuraava kuukausi Eri näppäimistö kytketty Avattu diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index b8cb9e3e105084..b98712e7814ff8 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb @@ -818,6 +818,7 @@ Voici quelques exemples de choses que vous pouvez essayer pour commencer.Ne pas déranger Émojis Force du signal : , pile du téléphone : +Téléchargement en cours d'analyse : Diffusion sur en cours… Nouvelle installation diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 2b0f8c04499032..5de5530cd151b2 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb @@ -623,6 +623,7 @@ Pour commencer, voici des exemples de ce que vous pouvez me demander.Lancer les sous-titres Code PIN incorrect Déverrouiller plus de fonctionnalités de l'Assistant. +Personnaliser Afficher le mois suivant Clavier différent branché Déverrouillé diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index beee6c23e5063a..ea62e97d01c698 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb @@ -623,6 +623,7 @@ Evo nekih stvari koje možete pokušati pokrenuti. Pokreni titlove Netočan PIN Otključajte više značajki Asistenta. +Prilagodba Prikaži sljedeći mjesec Povezana je neka druga tipkovnica Otključano diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index ce820ea547fa66..c644d2af64a29f 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb @@ -623,6 +623,7 @@ Berikut ini beberapa hal yang dapat Anda coba untuk memulai. Mulai teks tertutup PIN salah Dapatkan lebih banyak fitur Asisten. +Personalisasi Tampilkan bulan berikutnya Keyboard yang berbeda terhubung Kunci dibuka diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 05969936204f9f..558741f4b9a408 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb @@ -624,6 +624,7 @@ Ecco alcune cose che puoi provare per iniziare. Avvia sottotitoli PIN errato Sblocca altre funzioni dell'assistente. +Personalizza Mostra mese successivo Tastiera diversa collegata Sbloccato diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index f81cb300dcc767..cf862347e704b9 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb @@ -623,6 +623,7 @@ לפתיחת הכתוביות ‏PIN שגוי ‏אפשר להפעיל תכונות Assistant נוספות. +התאמה אישית הצגת החודש הבא חוברה מקלדת אחרת הנעילה בוטלה diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index f530531c976d78..3d82296f3840cd 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb @@ -623,6 +623,7 @@ 자막 사용 잘못된 PIN 더 많은 어시스턴트 기능을 사용해 보세요. +맞춤설정 다음 달 표시 다른 키보드 연결됨 잠금 해제됨 diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 294c3faf5f202b..8ed8a1bdeaa4bd 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb @@ -623,6 +623,7 @@ Tālāk ir norādīti daži ieteikumi darba sākšanai. Ieslēgt subtitrus Nepareizs PIN Piekļūstiet citām Asistenta funkcijām +Personalizēt Rādīt nākamo mēnesi Ir pievienota cita tastatūra Atbloķēts diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index a52e58d0ae178c..d25a8c89e90f62 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb @@ -624,6 +624,7 @@ Semua pengguna mesti log keluar untuk meneruskan. Mulakan sari kata PIN salah Buka kunci pelbagai lagi ciri Assistant. +Peribadikan Tunjukkan bulan seterusnya Papan kekunci lain disambungkan Tidak berkunci diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index eee08b30c598da..0f023f861909de 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb @@ -623,6 +623,7 @@ Hier zijn wat voorbeelden van wat je kunt proberen om aan de slag te gaan.Ondertiteling starten Onjuiste pincode Ontgrendel meer functies van de Assistent. +Personaliseren Volgende maand bekijken Ander toetsenbord aangesloten Ontgrendeld diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 1a139678cdcc65..fa040937e3efc5 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb @@ -623,6 +623,7 @@ କ୍ଲୋଜ୍ଡ କ୍ୟାପସନଗୁଡ଼ିକ ଆରମ୍ଭ କରନ୍ତୁ ଭୁଲ ପିନ୍ ଆହୁରି ଆସିଷ୍ଟାଣ୍ଟ ବୈଶିଷ୍ଟ୍ୟଗୁଡ଼ିକ ଅନ୍‌ଲକ୍‌ କରନ୍ତୁ +ପର୍ସନାଲାଇଜ କରନ୍ତୁ ପରବର୍ତ୍ତୀ ମାସ ଦେଖାନ୍ତୁ ଅଲଗା କୀବୋର୍ଡ ସଂଯୁକ୍ତ ହୋ‍ଇଛି ଅନଲକ୍ କରାଯାଇଛି diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 644971b339b616..c73cc55dac2258 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb @@ -623,6 +623,7 @@ ਬੰਦ ਸੁਰਖੀਆਂ ਸ਼ੁਰੂ ਕਰੋ ਗ਼ਲਤ PIN Assistant ਦੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਅਣਲਾਕ ਕਰੋ। +ਵਿਅਕਤੀਗਤ ਬਣਾਓ ਅਗਲਾ ਮਹੀਨਾ ਦਿਖਾਓ ਵੱਖਰਾ ਕੀ-ਬੋਰਡ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ Chromebook ਅਣਲਾਕ ਹੋ ਗਈ diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 268ed7c148fc24..05a9225546121d 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb @@ -623,6 +623,7 @@ Oto kilka rzeczy, które możesz wypróbować na początek. Włącz napisy Błędny kod PIN Poznaj więcej funkcji Asystenta. +Personalizacja Pokaż przyszły miesiąc Podłączono inną klawiaturę Odblokowano diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 41058364b1d330..aeb6b68d36d852 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb @@ -72,7 +72,7 @@ Показать настройки Bluetooth. . РЕКОМЕНДУЕМЫЕ ПРИЛОЖЕНИЯ Уровень сигнала – -Всегда показывать Временное хранилище +Всегда показывать панель запуска Быстрый доступ: недавние скриншоты, а также скачанные и закрепленные файлы Подключено устройство "". Открыть дополнительное меню @@ -497,7 +497,7 @@ Функция сочетания клавиш Ctrl + Alt + Стрелка вниз изменилась. Чтобы выполнить действие клавиши End, нажмите + Стрелка вправо. Отражение Для дополнительной безопасности введите пароль. -Открепить из Быстрого запуска +Открепить Изменить местоположение панели инструментов Доброе утро, ! Удалить все уведомления: @@ -623,6 +623,7 @@ Показать субтитры Неверный PIN-код Получите доступ к другим возможностям Ассистента. +Персонализировать Показать следующий месяц Подключена другая клавиатура Устройство разблокировано. diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index a23113c23c13dc..e932c21af910bc 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb @@ -623,6 +623,7 @@ Tu je nekaj stvari, ki jih lahko poskusite za začetek. Začni podnapise Napačen PIN Odklenite več funkcij Pomočnika. +Osebno prilagajanje Prikaz naslednjega meseca Priklopljena je druga tipkovnica Odklenjeno diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 1e2580c997f0e3..89f4ed8917affd 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb @@ -623,6 +623,7 @@ Ja disa gjëra që mund të provosh për të filluar. Fillo titrat Kod i pasaktë PIN Shkyç më shumë funksione të "Asistentit". +Personalizo Trego muajin e ardhshëm Është lidhur një tastierë tjetër Shkyçur diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index d07be26ae5247b..c6612c26a000e0 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb @@ -623,6 +623,7 @@ வசனங்களைக் காட்டு தவறான PIN மேலும் பல அசிஸ்டண்ட் அம்சங்களைப் பெறுக. +பிரத்தியேகமாக்குதல் அடுத்த மாதத்தைக் காட்டு வேறொரு கீபோர்டு இணைக்கப்பட்டது அன்லாக் செய்யப்பட்டது diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index e44212e77434cb..6aa15ed071bce0 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb @@ -623,6 +623,7 @@ Увімкнути субтитри Неправильний PIN-код Розблокуйте інші функції Асистента. +Персоналізація Показати наступний місяць Під’єднано іншу клавіатуру Розблоковано diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index ec956a93e8971c..e79c803f614e58 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb @@ -623,6 +623,7 @@ Dưới đây là một số việc bạn có thể thử để bắt đầu.Bắt đầu phụ đề Mã PIN không chính xác Mở khóa các tính năng khác của Trợ lý. +Cá nhân hoá Hiển thị tháng tiếp theo Đã kết nối bàn phím khác Đã mở khóa diff --git a/ash/system/time/calendar_event_list_view.cc b/ash/system/time/calendar_event_list_view.cc index 3ff4ccf019cea6..d498a65073b9a6 100644 --- a/ash/system/time/calendar_event_list_view.cc +++ b/ash/system/time/calendar_event_list_view.cc @@ -4,12 +4,14 @@ #include "ash/system/time/calendar_event_list_view.h" +#include "ash/strings/grit/ash_strings.h" #include "ash/system/time/calendar_utils.h" #include "ash/system/time/calendar_view_controller.h" #include "ash/system/tray/tray_popup_utils.h" #include "ash/system/tray/tri_view.h" #include "calendar_event_list_item_view.h" #include "google_apis/calendar/calendar_api_response_types.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/accessibility/view_accessibility.h" @@ -46,12 +48,12 @@ CalendarEventListView::CalendarEventListView( calendar_utils::GetPrimaryTextColor())); close_button_->SetImageHorizontalAlignment(views::ImageButton::ALIGN_RIGHT); close_button_->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); - close_button_->GetViewAccessibility().OverrideName(GetClassName()); close_button_->SetBorder(views::CreateEmptyBorder(kContentInsets)); + close_button_->SetAccessibleName( + l10n_util::GetStringUTF16(IDS_ASH_CLOSE_BUTTON_ACCESSIBLE_DESCRIPTION)); + close_button_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_ASH_CLOSE_BUTTON_TOOLTIP)); close_button_->SetFocusBehavior(FocusBehavior::ALWAYS); - // TODO(https://crbug.com/1238927) set tool tip and accessible label - // close_button_->SetAccessibleName(close_button_label); - // close_button_->SetTooltipText(close_button_label); scroll_view_->SetAllowKeyboardScrolling(false); scroll_view_->SetBackgroundColor(absl::nullopt); diff --git a/ash/system/time/calendar_month_view.cc b/ash/system/time/calendar_month_view.cc index ed353078f09641..80c0251b7c4f78 100644 --- a/ash/system/time/calendar_month_view.cc +++ b/ash/system/time/calendar_month_view.cc @@ -5,13 +5,16 @@ #include "ash/system/time/calendar_month_view.h" #include "ash/public/cpp/ash_typography.h" +#include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" #include "ash/system/time/calendar_utils.h" #include "ash/system/time/calendar_view_controller.h" #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/i18n/time_formatting.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/compositor/layer.h" #include "ui/gfx/canvas.h" @@ -117,6 +120,21 @@ void CalendarDateCellView::OnPaintBackground(gfx::Canvas* canvas) { // If the view is focused or selected, paint a solid background. is_selected_ = calendar_utils::IsTheSameDay( date_, calendar_view_controller_->selected_date()); + + // Sets accessible label. E.g. Calendar, week of July 16th 2021, [selected + // date] is currently selected. + if (is_selected_) { + base::Time unexploded; + bool result = base::Time::FromUTCExploded(date_, &unexploded); + DCHECK(result); + unexploded -= base::Days(date_.day_of_week); + + SetAccessibleName(l10n_util::GetStringFUTF16( + IDS_ASH_CALENDAR_SELECTED_DATE_CELL_ACCESSIBLE_DESCRIPTION, + base::TimeFormatWithPattern(unexploded, "MMMMdyyyy"), + base::UTF8ToUTF16(base::NumberToString(date_.day_of_month)))); + } + if (views::View::HasFocus() || is_selected_) { // Change text color to the background color. const SkColor text_color = color_provider->GetBaseLayerColor( @@ -190,14 +208,29 @@ gfx::Point CalendarDateCellView::GetEventsPresentIndicatorCenterPosition() { } void CalendarDateCellView::MaybeDrawEventsIndicator(gfx::Canvas* canvas) { + if (grayed_out_) + return; + base::Time unexploded; bool result = base::Time::FromUTCExploded(date_, &unexploded); DCHECK(result); - if (!calendar_view_controller_->IsDayWithEvents(unexploded, - /*events =*/nullptr)) { + const int event_number = + calendar_view_controller_->EventsNumberOfDay(unexploded, + /*events =*/nullptr); + const int tooltip_id = (event_number <= 1) + ? IDS_ASH_CALENDAR_DATE_CELL_TOOLTIP + : IDS_ASH_CALENDAR_DATE_CELL_PLURAL_EVENTS_TOOLTIP; + + SetTooltipText(l10n_util::GetStringFUTF16( + tooltip_id, base::TimeFormatWithPattern(unexploded, "MMMMdyyyy"), + base::UTF8ToUTF16(base::NumberToString(event_number)))); + SetAccessibleName(l10n_util::GetStringFUTF16( + tooltip_id, base::TimeFormatWithPattern(unexploded, "MMMMdyyyy"), + base::UTF8ToUTF16(base::NumberToString(event_number)))); + + if (event_number == 0) return; - } cc::PaintFlags indicator_paint_flags; indicator_paint_flags.setColor(AshColorProvider::Get()->GetControlsLayerColor( diff --git a/ash/system/time/calendar_view.cc b/ash/system/time/calendar_view.cc index 41675b55bee1c0..de26273f88f00a 100644 --- a/ash/system/time/calendar_view.cc +++ b/ash/system/time/calendar_view.cc @@ -306,7 +306,11 @@ CalendarView::CalendarView(DetailedViewDelegate* delegate, scroll_view_->SetDrawOverflowIndicator(false); scroll_view_->SetVerticalScrollBarMode( views::ScrollView::ScrollBarMode::kHiddenButEnabled); - scroll_view_->GetViewAccessibility().OverrideName(GetClassName()); + scroll_view_->GetViewAccessibility().OverrideRole(ax::mojom::Role::kGroup); + scroll_view_->GetViewAccessibility().OverrideName(l10n_util::GetStringFUTF16( + IDS_ASH_CALENDAR_BUBBLE_ACCESSIBLE_DESCRIPTION, + base::TimeFormatWithPattern(calendar_view_controller_->current_date(), + "MMMM yyyy"))); scroll_view_->SetFocusBehavior(FocusBehavior::ALWAYS); on_contents_scrolled_subscription_ = scroll_view_->AddContentsScrolledCallback(base::BindRepeating( @@ -350,6 +354,8 @@ void CalendarView::CreateExtraTitleRowButtons() { reset_to_today_button_ = CreateInfoButton( base::BindRepeating(&CalendarView::ResetToToday, base::Unretained(this)), IDS_ASH_CALENDAR_INFO_BUTTON_ACCESSIBLE_DESCRIPTION); + reset_to_today_button_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_ASH_CALENDA_TODAY_BUTTON_TOOLTIP)); tri_view()->AddView(TriView::Container::END, reset_to_today_button_); DCHECK(!settings_button_); @@ -358,6 +364,8 @@ void CalendarView::CreateExtraTitleRowButtons() { &UnifiedSystemTrayController::HandleOpenDateTimeSettingsAction, base::Unretained(controller_)), IDS_ASH_CALENDAR_SETTINGS); + settings_button_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_ASH_CALENDAR_SETTINGS_TOOLTIP)); tri_view()->AddView(TriView::Container::END, settings_button_); } @@ -671,6 +679,22 @@ void CalendarView::OpenEventList() { if (event_list_container_) return; + // Updates `scroll_view_`'s accessible name with the selected date. + absl::optional selected_date = + calendar_view_controller_->selected_date(); + DCHECK(selected_date.has_value()); + base::Time unexploded_selected_date; + bool result = base::Time::FromUTCExploded(selected_date.value(), + &unexploded_selected_date); + DCHECK(result); + scroll_view_->GetViewAccessibility().OverrideName(l10n_util::GetStringFUTF16( + IDS_ASH_CALENDAR_CONTENT_ACCESSIBLE_DESCRIPTION, + base::TimeFormatWithPattern(calendar_view_controller_->current_date(), + "MMMM yyyy"), + base::TimeFormatWithPattern(unexploded_selected_date, "MMMMdyyyy"))); + scroll_view_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, + /*send_native_event=*/true); + scroll_view_->SetVerticalScrollBarMode( views::ScrollView::ScrollBarMode::kHiddenButEnabled); @@ -702,6 +726,13 @@ void CalendarView::OpenEventList() { } void CalendarView::CloseEventList() { + // Updates `scroll_view_`'s accessible name without the selected date. + scroll_view_->GetViewAccessibility().OverrideName(l10n_util::GetStringFUTF16( + IDS_ASH_CALENDAR_BUBBLE_ACCESSIBLE_DESCRIPTION, + base::TimeFormatWithPattern(calendar_view_controller_->current_date(), + "MMMM yyyy"))); + scroll_view_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, + /*send_native_event=*/true); scroll_view_->ClipHeightTo(0, INT_MAX); scroll_view_->SetVerticalScrollBarMode( views::ScrollView::ScrollBarMode::kHiddenButEnabled); diff --git a/ash/system/time/calendar_view_controller.cc b/ash/system/time/calendar_view_controller.cc index 3691a77d242376..552177258b5d10 100644 --- a/ash/system/time/calendar_view_controller.cc +++ b/ash/system/time/calendar_view_controller.cc @@ -262,12 +262,13 @@ SingleDayEventList CalendarViewController::SelectedDateEvents() { return FindEvents(date); } -bool CalendarViewController::IsDayWithEventsInternal( +int CalendarViewController::EventsNumberOfDayInternal( base::Time day, SingleDayEventList* events) const { const SingleDayEventList& list = FindEvents(day); + if (list.empty()) - return false; + return 0; // We have events, and we assume the destination is empty. if (events) { @@ -275,16 +276,16 @@ bool CalendarViewController::IsDayWithEventsInternal( *events = list; } - return true; + return list.size(); } -bool CalendarViewController::IsDayWithEvents(base::Time day, - SingleDayEventList* events) { - bool has_events = IsDayWithEventsInternal(day, events); - if (has_events) { +int CalendarViewController::EventsNumberOfDay(base::Time day, + SingleDayEventList* events) { + int event_number = EventsNumberOfDayInternal(day, events); + if (event_number != 0) { QueuePrunableMonth(calendar_utils::GetStartOfMonthUTC(day)); } - return has_events; + return event_number; } void CalendarViewController::ShowEventListView( diff --git a/ash/system/time/calendar_view_controller.h b/ash/system/time/calendar_view_controller.h index c7c550f62f79df..c85c9db718bc78 100644 --- a/ash/system/time/calendar_view_controller.h +++ b/ash/system/time/calendar_view_controller.h @@ -142,12 +142,10 @@ class ASH_EXPORT CalendarViewController { // The calendar events of the selected date. SingleDayEventList SelectedDateEvents(); - // Same as `IsDayWithEventsInternal`, except that return of any events on + // Same as `EventsNumberOfDayInternal`, except that return of any events on // `day` constitutes "use" in the most-recently-used sense, so the month that - // includes day will then be promoted to most-recently-used status. If you - // just want to know whether a day contains any events, use - // `IsDayWithEventsInternal`. - bool IsDayWithEvents(base::Time day, SingleDayEventList* events); + // includes day will then be promoted to most-recently-used status. + int EventsNumberOfDay(base::Time day, SingleDayEventList* events); // A callback passed into the`CalendarDateCellView`, which is called when the // cell is clicked to show the event list view. @@ -216,12 +214,12 @@ class ASH_EXPORT CalendarViewController { // limit the amount we cache. void QueuePrunableMonth(base::Time start_of_month); - // Returns true if `day` contains any events we've previously fetched, false - // otherwise. If `events` is non-nullptr then we assign it to the EventList - // for `day`. Callers should NOT cache `events` themselves, and should - // instead just call this method again if they need to. - bool IsDayWithEventsInternal(base::Time day, - SingleDayEventList* events) const; + // Returns the number of events that this `day` contains. If `events` is + // non-nullptr then we assign it to the EventList for `day`. Callers should + // NOT cache `events` themselves, and should instead just call this method + // again if they need to. + int EventsNumberOfDayInternal(base::Time day, + SingleDayEventList* events) const; // The current date, which can be today or the first day of the current month // if current month is not today's month. diff --git a/ash/system/time/calendar_view_controller_unittest.cc b/ash/system/time/calendar_view_controller_unittest.cc index 9fb3f08a4c1670..d0a7cbb21844e8 100644 --- a/ash/system/time/calendar_view_controller_unittest.cc +++ b/ash/system/time/calendar_view_controller_unittest.cc @@ -207,7 +207,7 @@ class CalendarViewControllerEventsTest : public AshTestBase { AshTestBase::TearDown(); } - bool IsDayWithEvents(const char* day, SingleDayEventList* events) { + int EventsNumberOfDay(const char* day, SingleDayEventList* events) { base::Time day_base; bool result = base::Time::FromString(day, &day_base); @@ -216,11 +216,11 @@ class CalendarViewControllerEventsTest : public AshTestBase { if (events) DCHECK(events->empty()); - return controller_->IsDayWithEvents(day_base, events); + return controller_->EventsNumberOfDay(day_base, events); } - bool IsDayWithEventsInternal(const char* day, - SingleDayEventList* events) const { + int EventsNumberOfDayInternal(const char* day, + SingleDayEventList* events) const { base::Time day_base; bool result = base::Time::FromString(day, &day_base); @@ -229,7 +229,7 @@ class CalendarViewControllerEventsTest : public AshTestBase { if (events) DCHECK(events->empty()); - return controller_->IsDayWithEventsInternal(day_base, events); + return controller_->EventsNumberOfDayInternal(day_base, events); } bool IsEventPresent(const char* event_id, SingleDayEventList& events) { @@ -250,7 +250,7 @@ class CalendarViewControllerEventsTest : public AshTestBase { base::Time CalendarViewControllerEventsTest::fake_time_; -TEST_F(CalendarViewControllerEventsTest, IsDayWithEvents_OneDay) { +TEST_F(CalendarViewControllerEventsTest, DayWithEvents_OneDay) { const char* kStartTime = "23 Oct 2009 11:30 GMT"; const char* kEndTime = "23 Oct 2009 12:30 GMT"; const char* kId = "id_0"; @@ -277,7 +277,7 @@ TEST_F(CalendarViewControllerEventsTest, IsDayWithEvents_OneDay) { // Haven't injected anything yet, so no events on kStartTime0. events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime, &events)); EXPECT_TRUE(events.empty()); // Inject events (pretend the user just added them). @@ -290,12 +290,12 @@ TEST_F(CalendarViewControllerEventsTest, IsDayWithEvents_OneDay) { // Now we have an event on kStartTime0. events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime, &events)); EXPECT_FALSE(events.empty()); EXPECT_TRUE(events.size() == 1); } -TEST_F(CalendarViewControllerEventsTest, IsDayWithEvents_TwoDays) { +TEST_F(CalendarViewControllerEventsTest, DayWithEvents_TwoDays) { const char* kStartTime0 = "23 Oct 2009 11:30 GMT"; const char* kEndTime0 = "23 Oct 2009 12:30 GMT"; const char* kId0 = "id_0"; @@ -328,10 +328,10 @@ TEST_F(CalendarViewControllerEventsTest, IsDayWithEvents_TwoDays) { // Haven't injected anything yet, so no events on kStartTime0 or kStartTime1. events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime0, &events)); EXPECT_TRUE(events.empty()); events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime1, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime1, &events)); EXPECT_TRUE(events.empty()); // Inject both events. @@ -342,10 +342,10 @@ TEST_F(CalendarViewControllerEventsTest, IsDayWithEvents_TwoDays) { // Now both days should have events. events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime0, &events)); EXPECT_FALSE(events.empty()); events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime1, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime1, &events)); EXPECT_FALSE(events.empty()); } @@ -384,7 +384,7 @@ TEST_F(CalendarViewControllerEventsTest, OnlyFetchOnce) { // No events at kStartTime0. events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime0, &events)); EXPECT_TRUE(events.empty()); // Inject one event, pretend the user just added it somewhere else. @@ -396,7 +396,7 @@ TEST_F(CalendarViewControllerEventsTest, OnlyFetchOnce) { // Confirm we have only event 0 and NOT events 1 or 2. events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime0, &events)); EXPECT_FALSE(events.empty()); EXPECT_TRUE(events.size() == 1); EXPECT_TRUE(IsEventPresent(kId0, events)); @@ -423,7 +423,7 @@ TEST_F(CalendarViewControllerEventsTest, OnlyFetchOnce) { // because as far as the controller is concerned we've already fetched this // month. events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime0, &events)); EXPECT_FALSE(events.empty()); EXPECT_TRUE(events.size() == 1); EXPECT_TRUE(IsEventPresent(kId0, events)); @@ -470,13 +470,13 @@ TEST_F(CalendarViewControllerEventsTest, EventsDifferentMonths) { // No events on any day. events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime0, &events)); EXPECT_TRUE(events.empty()); events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime1, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime1, &events)); EXPECT_TRUE(events.empty()); events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime2, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime2, &events)); EXPECT_TRUE(events.empty()); // Inject events (user added them to their calendar). @@ -490,17 +490,17 @@ TEST_F(CalendarViewControllerEventsTest, EventsDifferentMonths) { // Confirm we have all three events. events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime0, &events)); EXPECT_FALSE(events.empty()); EXPECT_TRUE(events.size() == 1); EXPECT_TRUE(IsEventPresent(kId0, events)); events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime1, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime1, &events)); EXPECT_FALSE(events.empty()); EXPECT_TRUE(events.size() == 1); EXPECT_TRUE(IsEventPresent(kId1, events)); events.clear(); - EXPECT_TRUE(IsDayWithEvents(kStartTime2, &events)); + EXPECT_EQ(1, EventsNumberOfDay(kStartTime2, &events)); EXPECT_FALSE(events.empty()); EXPECT_TRUE(events.size() == 1); EXPECT_TRUE(IsEventPresent(kId2, events)); @@ -606,13 +606,13 @@ TEST_F(CalendarViewControllerEventsTest, PruneEvents) { // Events 0, 1, and 2 should be cached, but not 3. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime0, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime1, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime1, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime2, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime2, &events)); events.clear(); - EXPECT_FALSE(IsDayWithEventsInternal(kStartTime3, &events)); + EXPECT_EQ(0, EventsNumberOfDayInternal(kStartTime3, &events)); // Advance us to kStartTime2 and fetch again. result = base::Time::FromString(kStartTime2, ¤t_date); @@ -622,7 +622,7 @@ TEST_F(CalendarViewControllerEventsTest, PruneEvents) { // Now kStartTime3 should be cached. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime3, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime3, &events)); // Keep advancing us one month at a time, right up to the point where we need // to prune. @@ -631,77 +631,77 @@ TEST_F(CalendarViewControllerEventsTest, PruneEvents) { controller_->UpdateMonth(current_date); controller_->FetchEvents(); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime4, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime4, &events)); result = base::Time::FromString(kStartTime4, ¤t_date); DCHECK(result); controller_->UpdateMonth(current_date); controller_->FetchEvents(); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime5, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime5, &events)); // Now we're about to add a 7th month to the cache, so we're going to need to // prune the least-recently-used prunable month, which is kStartTime3. So, // kStartTime3 should show up as a day with events before we advance, but not // after, which means we pruned as expected. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime3, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime3, &events)); result = base::Time::FromString(kStartTime5, ¤t_date); DCHECK(result); controller_->UpdateMonth(current_date); controller_->FetchEvents(); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime6, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime6, &events)); events.clear(); - EXPECT_FALSE(IsDayWithEventsInternal(kStartTime3, &events)); + EXPECT_EQ(0, EventsNumberOfDayInternal(kStartTime3, &events)); // Verify that our non-prunable months are still present. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime0, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime1, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime1, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime2, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime2, &events)); // If we advance again, kStartTime4 should be pruned. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime4, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime4, &events)); result = base::Time::FromString(kStartTime6, ¤t_date); DCHECK(result); controller_->UpdateMonth(current_date); controller_->FetchEvents(); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime7, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime7, &events)); events.clear(); - EXPECT_FALSE(IsDayWithEventsInternal(kStartTime4, &events)); + EXPECT_EQ(0, EventsNumberOfDayInternal(kStartTime4, &events)); // Verify that our non-prunable months are still present. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime0, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime1, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime1, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime2, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime2, &events)); // If we advance again, kStartTime5 should be pruned. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime5, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime5, &events)); result = base::Time::FromString(kStartTime7, ¤t_date); DCHECK(result); controller_->UpdateMonth(current_date); controller_->FetchEvents(); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime8, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime8, &events)); events.clear(); - EXPECT_FALSE(IsDayWithEventsInternal(kStartTime5, &events)); + EXPECT_EQ(0, EventsNumberOfDayInternal(kStartTime5, &events)); // Verify that our non-prunable months are still present. events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime0, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime0, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime1, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime1, &events)); events.clear(); - EXPECT_TRUE(IsDayWithEventsInternal(kStartTime2, &events)); + EXPECT_EQ(1, EventsNumberOfDayInternal(kStartTime2, &events)); } TEST_F(CalendarViewControllerEventsTest, RecordFetchResultHistogram_Success) { @@ -732,7 +732,7 @@ TEST_F(CalendarViewControllerEventsTest, RecordFetchResultHistogram_Success) { // Haven't injected anything yet, so no events on kStartTime0. events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime, &events)); EXPECT_TRUE(events.empty()); // Inject events (pretend the user just added them). @@ -778,7 +778,7 @@ TEST_F(CalendarViewControllerEventsTest, RecordFetchResultHistogram_Failure) { // Haven't injected anything yet, so no events on kStartTime0. events.clear(); - EXPECT_FALSE(IsDayWithEvents(kStartTime, &events)); + EXPECT_EQ(0, EventsNumberOfDay(kStartTime, &events)); EXPECT_TRUE(events.empty()); // Inject events (pretend the user just added them). diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn index 9d493d05c0cd54..7ef30e7b936701 100644 --- a/ash/webui/personalization_app/resources/BUILD.gn +++ b/ash/webui/personalization_app/resources/BUILD.gn @@ -62,8 +62,8 @@ polymer_js_files = [ "trusted/wallpaper/wallpaper_images_element.js", "trusted/wallpaper/wallpaper_selected_element.js", - "untrusted/collections_grid.js", - "untrusted/images_grid.js", + "untrusted/collections_grid.ts", + "untrusted/images_grid.ts", "untrusted/styles.ts", ] @@ -136,11 +136,21 @@ ts_library("build_ts") { definitions = [] + path_mappings = [ + "chrome-untrusted://personalization/polymer/v3_0/polymer/polymer_bundled.min.js|" + rebase_path( + "//third_party/polymer/v3_0/components-chromium/polymer/polymer.d.ts", + target_gen_dir), + "chrome-untrusted://resources/js/load_time_data.m.js|" + rebase_path( + "$root_gen_dir/ui/webui/resources/preprocessed/js/load_time_data.m.d.ts", + target_gen_dir), + ] + extra_deps = [ ":copy_js_to_common", ":copy_mojo_to_trusted", ":preprocess", ":preprocess_generated", + "//ui/webui/resources:generate_definitions", ] } diff --git a/ash/webui/personalization_app/resources/common/constants.ts b/ash/webui/personalization_app/resources/common/constants.ts index 51c2ee34356cb6..d1c73ce9c60fa7 100644 --- a/ash/webui/personalization_app/resources/common/constants.ts +++ b/ash/webui/personalization_app/resources/common/constants.ts @@ -44,12 +44,12 @@ export type SendCollectionsEvent = { export type SendGooglePhotosCountEvent = { type: EventType.SEND_GOOGLE_PHOTOS_COUNT, - count: bigint|null, + count: number|null, }; export type SendGooglePhotosPhotosEvent = { type: EventType.SEND_GOOGLE_PHOTOS_PHOTOS, - photos: any[]|null, + photos: unknown[]|null, }; export type SelectCollectionEvent = { diff --git a/ash/webui/personalization_app/resources/trusted/iframe_api.ts b/ash/webui/personalization_app/resources/trusted/iframe_api.ts index d7c881546efb06..b54997cf193707 100644 --- a/ash/webui/personalization_app/resources/trusted/iframe_api.ts +++ b/ash/webui/personalization_app/resources/trusted/iframe_api.ts @@ -32,7 +32,7 @@ export function sendCollections( /** * Sends the count of Google Photos photos to untrusted. */ -export function sendGooglePhotosCount(target: Window, count: bigint|null) { +export function sendGooglePhotosCount(target: Window, count: number|null) { const event: constants.SendGooglePhotosCountEvent = { type: constants.EventType.SEND_GOOGLE_PHOTOS_COUNT, count diff --git a/ash/webui/personalization_app/resources/untrusted/collections_grid.js b/ash/webui/personalization_app/resources/untrusted/collections_grid.ts similarity index 64% rename from ash/webui/personalization_app/resources/untrusted/collections_grid.js rename to ash/webui/personalization_app/resources/untrusted/collections_grid.ts index 3d7a353625eac7..dc85e0dec9d54c 100644 --- a/ash/webui/personalization_app/resources/untrusted/collections_grid.js +++ b/ash/webui/personalization_app/resources/untrusted/collections_grid.ts @@ -7,8 +7,9 @@ import './setup.js'; import './styles.js'; import {afterNextRender, html, PolymerElement} from 'chrome-untrusted://personalization/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {loadTimeData} from 'chrome-untrusted://resources/js/load_time_data.m.js'; -import {EventType, kMaximumLocalImagePreviews} from '../common/constants.js'; +import {Events, EventType, kMaximumLocalImagePreviews} from '../common/constants.js'; import {getLoadingPlaceholderAnimationDelay, getNumberOfGridItemsPerRow, isNullOrArray, isNullOrNumber, isSelectionEvent} from '../common/utils.js'; import {selectCollection, selectGooglePhotosCollection, selectLocalCollection, validateReceivedData} from '../untrusted/iframe_api.js'; @@ -23,61 +24,75 @@ const kLocalCollectionId = 'local_'; /** Height in pixels of a tile. */ const kTileHeightPx = 136; -/** @enum {string} */ -const TileType = { - loading: 'loading', - image: 'image', - failure: 'failure', +enum TileType { + LOADING = 'loading', + IMAGE = 'image', + FAILURE = 'failure', +} + +/** mirror from mojom type, cannot use mojom type directly from untrusted. */ +type Url = { + url: string }; -/** - * @typedef {{type: TileType}} - */ -let LoadingTile; +/** mirror from mojom type, cannot use mojom type directly from untrusted. */ +type FilePath = { + path: string +}; + +/** mirror from mojom type, cannot use mojom type directly from untrusted. */ +type WallpaperCollection = { + id: string, + name: string, + preview?: Url, +}; + +type LoadingTile = { + type: TileType.LOADING +}; /** * Type that represents a collection that failed to load. The preview image * is still displayed, but is grayed out and unclickable. - * @typedef {{ - * id: string, - * name: string, - * preview: !Array, - * type: TileType, - * }} */ -let FailureTile; +type FailureTile = { + type: TileType.FAILURE, + id: string, + name: string, + preview: [], +}; /** * A displayable type constructed from up to three LocalImages or a * WallpaperCollection. - * @typedef {{ - * id: string, - * name: string, - * count: string, - * preview: !Array, - * type: TileType, - * }} */ -let ImageTile; +type ImageTile = { + type: TileType.IMAGE, + id: string, + name: string, + count: string, + preview: Url[], +}; + +type Tile = LoadingTile|FailureTile|ImageTile; -/** @typedef {LoadingTile|FailureTile|ImageTile} */ -let Tile; +interface RepeaterEvent extends CustomEvent { + model: { + item: Tile, + }; +} /** * Get the text to display for number of images. - * @param {?number|undefined} x - * @return {string} */ -function getCountText(x) { +function getCountText(x: number|null|undefined): string { switch (x) { case undefined: case null: return ''; case 0: - case 0n: return loadTimeData.getString('zeroImages'); case 1: - case 1n: return loadTimeData.getString('oneImage'); default: if ('number' !== typeof x || x < 0) { @@ -90,27 +105,20 @@ function getCountText(x) { /** * Returns the tile to display for the Google Photos collection. - * @param {?Array} googlePhotos - * @param {?number} googlePhotosCount - * @return {!ImageTile} */ -function getGooglePhotosTile(googlePhotos, googlePhotosCount) { +function getGooglePhotosTile( + _: unknown[], googlePhotosCount: number|null): ImageTile { return { name: loadTimeData.getString('googlePhotosLabel'), id: kGooglePhotosCollectionId, count: getCountText(googlePhotosCount ?? 0), preview: [], - type: TileType.image, + type: TileType.IMAGE, }; } -/** - * - * @param {?Array} localImages - * @param {Object} localImageData - * @return {!Array} - */ -function getImages(localImages, localImageData) { +function getImages( + localImages: FilePath[], localImageData: Record): Url[] { if (!localImageData || !Array.isArray(localImages)) { return []; } @@ -131,11 +139,10 @@ function getImages(localImages, localImageData) { /** * A common display format between local images and WallpaperCollection. * Get the first displayable image with data from the list of possible images. - * @param {!Array} localImages - * @param {!Object} localImageData - * @return {!ImageTile|!LoadingTile} */ -function getLocalTile(localImages, localImageData) { +function getLocalTile( + localImages: FilePath[], + localImageData: {[key: string]: string}): ImageTile|LoadingTile { const isMoreToLoad = localImages.some(({path}) => !localImageData.hasOwnProperty(path)); @@ -144,7 +151,7 @@ function getLocalTile(localImages, localImageData) { if (imagesToDisplay.length < kMaximumLocalImagePreviews && isMoreToLoad) { // If there are more images to attempt loading thumbnails for, wait until // those are done. - return {type: TileType.loading}; + return {type: TileType.LOADING}; } // Count all images that failed to load and subtract them from "My Images" @@ -159,7 +166,7 @@ function getLocalTile(localImages, localImageData) { count: getCountText( Array.isArray(localImages) ? localImages.length - failureCount : 0), preview: imagesToDisplay, - type: TileType.image, + type: TileType.IMAGE, }; } @@ -174,63 +181,33 @@ export class CollectionsGrid extends PolymerElement { static get properties() { return { - /** - * @type {Array} - * @private - */ - collections_: { - type: Array, - }, + collections_: Array, /** * The list of Google Photos photos. - * @type {?Array} - * @private */ - googlePhotos_: { - type: Array, - }, + googlePhotos_: Array, /** * The count of Google Photos photos. - * @type {?number} - * @private */ - googlePhotosCount_: { - type: Number, - }, + googlePhotosCount_: Number, /** * Mapping of collection id to number of images. Loads in progressively * after collections_. - * @type {Object} - * @private */ - imageCounts_: { - type: Object, - }, + imageCounts_: Object, - /** - * @type {Array} - * @private - */ - localImages_: { - type: Array, - }, + localImages_: Array, /** * Stores a mapping of local image id to thumbnail data. - * @type {Object} - * @private */ - localImageData_: { - type: Object, - }, + localImageData_: Object, /** * List of tiles to be displayed to the user. - * @type {!Array} - * @private */ tiles_: { type: Array, @@ -239,12 +216,20 @@ export class CollectionsGrid extends PolymerElement { // number of tiles when collections are received. const x = getNumberOfGridItemsPerRow(); const y = Math.floor(window.innerHeight / kTileHeightPx); - return Array.from({length: x * y}, () => ({type: TileType.loading})); + return Array.from({length: x * y}, () => ({type: TileType.LOADING})); } }, }; } + private collections_: WallpaperCollection[]; + private googlePhotos_: unknown[]|null; + private googlePhotosCount_: number|null; + private imageCounts_: {[key: string]: number}; + private localImages_: FilePath[]; + private localImageData_: {[key: string]: string}; + private tiles_: Tile[]; + static get observers() { return [ 'onLocalImagesLoaded_(localImages_, localImageData_)', @@ -253,34 +238,33 @@ export class CollectionsGrid extends PolymerElement { ]; } - /** @override */ constructor() { super(); this.onMessageReceived_ = this.onMessageReceived_.bind(this); } - /** @override */ connectedCallback() { super.connectedCallback(); window.addEventListener('message', this.onMessageReceived_); } - /** @override */ disconnectedCallback() { super.disconnectedCallback(); window.removeEventListener('message', this.onMessageReceived_); } + getLoadingPlaceholderAnimationDelay(index: number): string { + return getLoadingPlaceholderAnimationDelay(index); + } + /** * Called each time a new collection finishes loading. |imageCounts| contains * a mapping of collection id to the number of images in that collection. * A value of null indicates that the given collection id has failed to load. - * @private - * @param {?Array} - * collections - * @param {?Object} imageCounts */ - onCollectionLoaded_(collections, imageCounts) { + private onCollectionLoaded_( + collections: WallpaperCollection[]|null, + imageCounts: {[key: string]: number|undefined}) { if (!Array.isArray(collections) || !imageCounts) { return; } @@ -293,7 +277,7 @@ export class CollectionsGrid extends PolymerElement { loadTimeData.getBoolean('isGooglePhotosIntegrationEnabled') ? 2 : 1; while (this.tiles_.length < collections.length + offset) { - this.push('tiles_', {type: TileType.loading}); + this.push('tiles_', {type: TileType.LOADING}); } while (this.tiles_.length > collections.length + offset) { this.pop('tiles_'); @@ -309,7 +293,7 @@ export class CollectionsGrid extends PolymerElement { name: collection.name, count: '', preview: [collection.preview], - type: TileType.failure, + type: TileType.FAILURE, }); return; } @@ -321,7 +305,7 @@ export class CollectionsGrid extends PolymerElement { name: collection.name, count: getCountText(imageCounts[collection.id]), preview: [collection.preview], - type: TileType.image, + type: TileType.IMAGE, }); } }); @@ -329,10 +313,9 @@ export class CollectionsGrid extends PolymerElement { /** * Invoked on changes to the list and count of Google Photos photos. - * @param {?Array} googlePhotos - * @param {?number} googlePhotosCount */ - onGooglePhotosLoaded_(googlePhotos, googlePhotosCount) { + private onGooglePhotosLoaded_( + googlePhotos: unknown[]|undefined, googlePhotosCount: number|undefined) { if (isNullOrArray(googlePhotos) && isNullOrNumber(googlePhotosCount)) { const tile = getGooglePhotosTile(googlePhotos, googlePhotosCount); this.set('tiles_.1', tile); @@ -342,11 +325,10 @@ export class CollectionsGrid extends PolymerElement { /** * Called with updated local image list or local image thumbnail data when * either of those properties changes. - * @param {?Array} localImages - * @param {Object} localImageData - * @private */ - onLocalImagesLoaded_(localImages, localImageData) { + private onLocalImagesLoaded_( + localImages: FilePath[]|undefined, + localImageData: {[key: string]: string}) { if (!Array.isArray(localImages) || !localImageData) { return; } @@ -357,65 +339,59 @@ export class CollectionsGrid extends PolymerElement { /** * Handler for messages from trusted code. Expects only SendImagesEvent and * will error on any other event. - * @param {!Event} message - * @private */ - onMessageReceived_(message) { - switch (message.data.type) { + private onMessageReceived_(message: MessageEvent) { + const event = message.data as Events; + const isValid = validateReceivedData(event, message.origin); + if (!isValid) { + console.warn('Invalid event message received, event type: ' + event.type); + } + + switch (event.type) { case EventType.SEND_COLLECTIONS: - try { - this.collections_ = - validateReceivedData(message, EventType.SEND_COLLECTIONS); - } catch (e) { - console.warn('Invalid collections received', e); - this.collections_ = []; - } + this.collections_ = isValid ? event.collections : []; break; case EventType.SEND_GOOGLE_PHOTOS_COUNT: - try { - this.googlePhotosCount_ = - validateReceivedData(message, EventType.SEND_GOOGLE_PHOTOS_COUNT); - } catch (e) { - console.warn('Invalid Google Photos count received', e); + if (isValid) { + this.googlePhotosCount_ = event.count; + } else { this.googlePhotos_ = null; this.googlePhotosCount_ = null; } break; case EventType.SEND_GOOGLE_PHOTOS_PHOTOS: - try { - this.googlePhotos_ = validateReceivedData( - message, EventType.SEND_GOOGLE_PHOTOS_PHOTOS); - } catch (e) { - console.warn('Invalid Google Photos photos received', e); + if (isValid) { + this.googlePhotos_ = event.photos; + } else { this.googlePhotos_ = null; this.googlePhotosCount_ = null; } break; case EventType.SEND_IMAGE_COUNTS: - this.imageCounts_ = message.data.counts; + this.imageCounts_ = event.counts; break; case EventType.SEND_LOCAL_IMAGES: - try { - this.localImages_ = - validateReceivedData(message, EventType.SEND_LOCAL_IMAGES); - } catch (e) { - console.warn('Invalid local images received', e); + if (isValid) { + this.localImages_ = event.images; + } else { this.localImages_ = []; this.localImageData_ = {}; } break; case EventType.SEND_LOCAL_IMAGE_DATA: - try { - this.localImageData_ = - validateReceivedData(message, EventType.SEND_LOCAL_IMAGE_DATA); - } catch (e) { - console.warn('Invalid local image data received', e); + if (isValid) { + this.localImageData_ = event.data; + } else { this.localImages_ = []; this.localImageData_ = {}; } break; case EventType.SEND_VISIBLE: - const visible = validateReceivedData(message, EventType.SEND_VISIBLE); + if (!isValid) { + return; + } + + const visible = event.visible; if (visible) { // If iron-list items were updated while this iron-list was hidden, // the layout will be incorrect. Trigger another layout when iron-list @@ -423,7 +399,7 @@ export class CollectionsGrid extends PolymerElement { // otherwise iron-list width may still be 0. afterNextRender(this, () => { // Trigger a layout now that iron-list has the correct width. - this.shadowRoot.querySelector('iron-list').fire('iron-resize'); + this.shadowRoot!.querySelector('iron-list')!.fire('iron-resize'); }); } return; @@ -433,31 +409,19 @@ export class CollectionsGrid extends PolymerElement { } } - /** - * @param {!ImageTile} tile - * @return {string} - */ - getClassForImagesContainer_(tile) { + private getClassForImagesContainer_(tile: ImageTile): string { const numImages = Array.isArray(tile?.preview) ? tile.preview.length : 0; return `photo-images-container photo-images-container-${ Math.min(numImages, kMaximumLocalImagePreviews)}`; } - /** - * @param {!ImageTile} tile - * @return {string} - */ - getClassForEmptyTile_(tile) { + getClassForEmptyTile_(tile: ImageTile): string { return `photo-inner-container ${ (this.isGooglePhotosTile_(tile) ? 'google-photos-empty' : 'photo-empty')}`; } - /** - * @param {!ImageTile} tile - * @return {string} - */ - getImageUrlForEmptyTile_(tile) { + getImageUrlForEmptyTile_(tile: ImageTile): string { return `//personalization/common/${ (this.isGooglePhotosTile_(tile) ? 'google_photos.svg' : 'no_images.svg')}`; @@ -465,10 +429,8 @@ export class CollectionsGrid extends PolymerElement { /** * Notify trusted code that a user selected a collection. - * @private - * @param {!Event} e */ - onCollectionSelected_(e) { + private onCollectionSelected_(e: RepeaterEvent) { const tile = e.model.item; if (!isSelectionEvent(e) || !this.isSelectableTile_(tile)) { return; @@ -488,85 +450,45 @@ export class CollectionsGrid extends PolymerElement { /** * Not using I18nBehavior because of chrome-untrusted:// incompatibility. - * @param {string} str - * @return {string} */ - geti18n_(str) { + private geti18n_(str: string): string { return loadTimeData.getString(str); } - /** - * @private - * @param {?Tile} item - * @return {boolean} - */ - isLoadingTile_(item) { - return item?.type === TileType.loading; + private isLoadingTile_(item: Tile|null): item is LoadingTile { + return item?.type === TileType.LOADING; } - /** - * @private - * @param {?Tile} item - * @return {boolean} - */ - isFailureTile_(item) { - return item?.type === TileType.failure; + private isFailureTile_(item: Tile|null): item is FailureTile { + return item?.type === TileType.FAILURE; } - /** - * @param {?Tile} item - * @return {boolean} - * @private - */ - isEmptyTile_(item) { - return !!item && item.type === TileType.image && item.preview.length === 0; + private isEmptyTile_(item: Tile|null): item is ImageTile { + return !!item && item.type === TileType.IMAGE && item.preview.length === 0; } - /** - * @param {?Tile} item - * @return {boolean} - * @private - */ - isGooglePhotosTile_(item) { - return item?.id === kGooglePhotosCollectionId; + private isGooglePhotosTile_(item: Tile|null): item is ImageTile|FailureTile { + return !!item && (item.type !== TileType.LOADING) && + (item?.id === kGooglePhotosCollectionId); } - /** - * @private - * @param {?Tile} item - * @return {boolean} - */ - isImageTile_(item) { - return item?.type === TileType.image && !this.isEmptyTile_(item); + private isImageTile_(item: Tile|null): item is ImageTile { + return item?.type === TileType.IMAGE && !this.isEmptyTile_(item); } - /** - * @param {?Tile} item - * @return {boolean} - * @private - */ - isSelectableTile_(item) { + private isSelectableTile_(item: Tile|null): item is ImageTile|FailureTile { return this.isGooglePhotosTile_(item) || this.isImageTile_(item); } - /** - * @param {number} index - * @return {string} - */ - getLoadingPlaceholderAnimationDelay(index) { - return getLoadingPlaceholderAnimationDelay(index); - } - /** * Make the text and background gradient visible again after the image has * finished loading. This is called for both on-load and on-error, as either * event should make the text visible again. - * @param {!Event} event - * @private */ - onImgLoad_(event) { - const parent = event.currentTarget.closest('.photo-inner-container'); - for (const elem of parent.querySelectorAll('[hidden]')) { + private onImgLoad_(event: Event) { + const self = event.currentTarget! as HTMLElement; + const parent = self.closest('.photo-inner-container'); + for (const elem of parent!.querySelectorAll('[hidden]')) { elem.removeAttribute('hidden'); } } diff --git a/ash/webui/personalization_app/resources/untrusted/iframe_api.ts b/ash/webui/personalization_app/resources/untrusted/iframe_api.ts index b674cf62b7b857..5e643cb2822988 100644 --- a/ash/webui/personalization_app/resources/untrusted/iframe_api.ts +++ b/ash/webui/personalization_app/resources/untrusted/iframe_api.ts @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertNotReached} from '../common/assert.m.js'; +import {assert} from '../common/assert.m.js'; import * as constants from '../common/constants.js'; import {isNonEmptyArray, isNullOrArray, isNullOrNumber} from '../common/utils.js'; @@ -59,54 +59,41 @@ export function selectImage(target: Window, assetId: bigint) { * expected type and contains the expected data. */ export function validateReceivedData( - event: MessageEvent, expectedEventType: constants.EventType) { + event: constants.Events, origin: string): boolean { assert( - event.origin === constants.trustedOrigin, + origin === constants.trustedOrigin, 'Message is not from the correct origin'); - assert( - event.data.type === expectedEventType, - `Expected event type: ${expectedEventType}`); - const data: constants.Events = event.data; - switch (data.type) { + switch (event.type) { case constants.EventType.SEND_COLLECTIONS: { - assert( - isNullOrArray(data.collections), - 'Expected collections array or null'); - return data.collections ?? []; + return isNullOrArray(event.collections); } case constants.EventType.SEND_GOOGLE_PHOTOS_COUNT: { - assert(isNullOrNumber(data.count), 'Expected photos count'); - return data.count; + return isNullOrNumber(event.count); } case constants.EventType.SEND_GOOGLE_PHOTOS_PHOTOS: { - assert(isNullOrArray(data.photos), 'Expected photos array'); - return data.photos; + return isNullOrArray(event.photos); } + case constants.EventType.SEND_IMAGE_COUNTS: + return typeof event.counts === 'object'; case constants.EventType.SEND_LOCAL_IMAGE_DATA: { - assert(typeof data.data === 'object', 'Expected data object'); - return data.data; + return typeof event.data === 'object'; } case constants.EventType.SEND_LOCAL_IMAGES: // Images array may be empty. - assert(Array.isArray(data.images), 'Expected images array'); - return data.images; + return Array.isArray(event.images); case constants.EventType.SEND_IMAGE_TILES: { // Images array may be empty. - assert(Array.isArray(data.tiles), 'Expected images array'); - return data.tiles; + return Array.isArray(event.tiles); } case constants.EventType.SEND_CURRENT_WALLPAPER_ASSET_ID: case constants.EventType.SEND_PENDING_WALLPAPER_ASSET_ID: { - assert(data.assetId === null || typeof data.assetId === 'bigint'); - return data.assetId; + return event.assetId === null || typeof event.assetId === 'bigint'; } case constants.EventType.SEND_VISIBLE: { - assert(typeof data.visible === 'boolean'); - return data.visible; + return typeof event.visible === 'boolean'; } default: - assertNotReached('Unknown event type'); + return false; } - return null; } diff --git a/ash/webui/personalization_app/resources/untrusted/images_grid.js b/ash/webui/personalization_app/resources/untrusted/images_grid.ts similarity index 63% rename from ash/webui/personalization_app/resources/untrusted/images_grid.js rename to ash/webui/personalization_app/resources/untrusted/images_grid.ts index 8289f98ad7783b..b3391a0a235a0d 100644 --- a/ash/webui/personalization_app/resources/untrusted/images_grid.js +++ b/ash/webui/personalization_app/resources/untrusted/images_grid.ts @@ -8,7 +8,8 @@ import './styles.js'; import {html, PolymerElement} from 'chrome-untrusted://personalization/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {EventType, ImageTile} from '../common/constants.js'; +import {assert, assertNotReached} from '../common/assert.m.js'; +import {Events, EventType, ImageTile} from '../common/constants.js'; import {isSelectionEvent} from '../common/utils.js'; import {selectImage, validateReceivedData} from '../untrusted/iframe_api.js'; @@ -28,28 +29,16 @@ class ImagesGrid extends PolymerElement { static get properties() { return { - /** - * @type {!Array} - * @private - */ tiles_: { type: Array, value: [], }, - /** - * @type {?bigint} - * @private - */ selectedAssetId_: { type: Object, value: null, }, - /** - * @type {?bigint} - * @private - */ pendingSelectedAssetId_: { type: Object, value: null, @@ -57,18 +46,20 @@ class ImagesGrid extends PolymerElement { }; } + private tiles_: ImageTile[]; + private selectedAssetId_: bigint|undefined; + private pendingSelectedAssetId_: bigint|undefined; + constructor() { super(); this.onMessageReceived_ = this.onMessageReceived_.bind(this); } - /** @override */ connectedCallback() { super.connectedCallback(); window.addEventListener('message', this.onMessageReceived_); } - /** @override */ disconnectedCallback() { super.disconnectedCallback(); window.removeEventListener('message', this.onMessageReceived_); @@ -77,36 +68,36 @@ class ImagesGrid extends PolymerElement { /** * Handler for messages from trusted code. Expects only SendImagesEvent and * will error on any other event. - * @param {!Event} message - * @private */ - onMessageReceived_(message) { - switch (message.data.type) { + private onMessageReceived_(message: MessageEvent) { + const event: Events = message.data; + switch (event.type) { case EventType.SEND_IMAGE_TILES: - try { - this.tiles_ = - validateReceivedData(message, EventType.SEND_IMAGE_TILES); - } catch (e) { - console.warn('Invalid images received', e); - this.tiles_ = []; - } + this.tiles_ = + validateReceivedData(event, message.origin) ? event.tiles : []; return; case EventType.SEND_CURRENT_WALLPAPER_ASSET_ID: - this.selectedAssetId_ = validateReceivedData( - message, EventType.SEND_CURRENT_WALLPAPER_ASSET_ID); + this.selectedAssetId_ = validateReceivedData(event, message.origin) ? + event.assetId : + undefined; return; case EventType.SEND_PENDING_WALLPAPER_ASSET_ID: - this.pendingSelectedAssetId_ = validateReceivedData( - message, EventType.SEND_PENDING_WALLPAPER_ASSET_ID); + this.pendingSelectedAssetId_ = + validateReceivedData(event, message.origin) ? event.assetId : + undefined; return; case EventType.SEND_VISIBLE: - const visible = validateReceivedData(message, EventType.SEND_VISIBLE); + let visible = false; + if (validateReceivedData(event, message.origin)) { + visible = event.visible; + } if (!visible) { // When the iframe is hidden, do some dom magic to hide old image // content. This is in preparation for a user switching to a new // wallpaper collection and loading a new set of images. - const ironList = this.shadowRoot.querySelector('iron-list'); - const images = ironList.querySelectorAll('.photo-container img'); + const ironList = this.shadowRoot!.querySelector('iron-list'); + const images: NodeListOf = + ironList!.querySelectorAll('.photo-container img'); for (const image of images) { image.src = ''; } @@ -118,13 +109,9 @@ class ImagesGrid extends PolymerElement { } } - /** - * @param {ImageTile} tile - * @param {?bigint} selectedAssetId - * @param {?bigint} pendingSelectedAssetId - * @return {string} - */ - getAriaSelected_(tile, selectedAssetId, pendingSelectedAssetId) { + private getAriaSelected_( + tile: ImageTile, selectedAssetId: bigint|undefined, + pendingSelectedAssetId: bigint|undefined): string { // Make sure that both are bigint (not undefined) and equal. return (typeof selectedAssetId === 'bigint' && tile?.assetId === selectedAssetId && !pendingSelectedAssetId || @@ -133,12 +120,7 @@ class ImagesGrid extends PolymerElement { .toString(); } - /** - * @param {number} index - * @param {ImageTile} tile - * @return {string} - */ - getClassForImg_(index, tile) { + private getClassForImg_(index: number, tile: ImageTile): string { if (tile.preview.length < 2) { return ''; } @@ -154,32 +136,25 @@ class ImagesGrid extends PolymerElement { /** * Notify trusted code that a user selected an image. - * @private - * @param {!Event} e */ - onImageSelected_(e) { + private onImageSelected_(e: Event) { if (!isSelectionEvent(e)) { return; } - const assetId = BigInt(e.currentTarget.dataset['assetId']); - selectImage(window.parent, assetId); + const imgElement = e.currentTarget as HTMLImageElement; + const assetId = imgElement.dataset['assetId']; + if (assetId === undefined) { + assertNotReached('assetId not found'); + return; + } + selectImage(window.parent, BigInt(assetId)); } - /** - * @private - * @param {!ImageTile} tile - * @return {string} - */ - getAriaLabel_(tile) { + private getAriaLabel_(tile: ImageTile): string { return tile.attribution.join(' '); } - /** - * @private - * @param {number} i - * @return {number} - */ - getAriaIndex_(i) { + private getAriaIndex_(i: number): number { return i + 1; } } diff --git a/ash/webui/projector_app/projector_app_client.cc b/ash/webui/projector_app/projector_app_client.cc index 30db41ab445d3c..23a1af7c63cbe9 100644 --- a/ash/webui/projector_app/projector_app_client.cc +++ b/ash/webui/projector_app/projector_app_client.cc @@ -13,6 +13,7 @@ namespace { constexpr char kPendingScreencastName[] = "name"; constexpr char kPendingScreencastUploadProgress[] = "uploadProgress"; +constexpr int64_t kPendingScreencastDiffThresholdInBytes = 600 * 1024; ProjectorAppClient* g_instance = nullptr; } // namespace @@ -20,21 +21,29 @@ ProjectorAppClient* g_instance = nullptr; base::Value PendingScreencast::ToValue() const { base::Value val(base::Value::Type::DICTIONARY); val.SetKey(kPendingScreencastName, base::Value(name)); - - // TODO(b/199421317): Show uploading progress of pending screencasts in - // gallery. Calculate and set the correct value here. - val.SetKey(kPendingScreencastUploadProgress, base::Value(0)); + DCHECK_GT(total_size_in_bytes, 0); + const double upload_progress = static_cast(bytes_transferred) / + static_cast(total_size_in_bytes); + val.SetKey(kPendingScreencastUploadProgress, + base::Value(upload_progress * 100)); return val; } -// TODO(b/199421317): Add transferred bytes check and show uploading progress of -// pending screencasts in gallery. bool PendingScreencast::operator==(const PendingScreencast& rhs) const { - return rhs.container_dir == container_dir; + // When the bytes of pending screencast didn't change a lot (less than + // kPendingScreencastDiffThresholdInBytes), we consider this pending + // screencast doesn't change. It helps to reduce the frequency of updating the + // pending screencast list. + return container_dir == rhs.container_dir && + std::abs(bytes_transferred - rhs.bytes_transferred) < + kPendingScreencastDiffThresholdInBytes; } -bool PendingScreencast::operator<(const PendingScreencast& rhs) const { - return rhs.container_dir < container_dir; +bool PendingScreencastSetComparator::operator()( + const PendingScreencast& a, + const PendingScreencast& b) const { + return a.container_dir < b.container_dir || + a.bytes_transferred < b.bytes_transferred; } // static diff --git a/ash/webui/projector_app/projector_app_client.h b/ash/webui/projector_app/projector_app_client.h index edd30c023683ef..e27c1ad0bff316 100644 --- a/ash/webui/projector_app/projector_app_client.h +++ b/ash/webui/projector_app/projector_app_client.h @@ -30,12 +30,10 @@ struct NewScreencastPrecondition; // TODO(b/201468756): pendings screencasts are sorted by created time. Add // `created_time` field to PendingScreencast. Screencasts might fail to -// upload. Add `failed_to_upload` field to PendingScreencast. Implement upload -// progress and add a custom comparator. +// upload. Add `failed_to_upload` field to PendingScreencast. struct PendingScreencast { base::Value ToValue() const; bool operator==(const PendingScreencast& rhs) const; - bool operator<(const PendingScreencast& rhs) const; // The container path of the screencast. It's a relative path of drive, looks // like "/root/projector_data/abc". @@ -43,8 +41,21 @@ struct PendingScreencast { // The display name of screencast. If `container_dir` is // "/root/projector_data/abc", the `name` is "abc". std::string name; + // The total size of a screencast in bytes, including all media files and + // metadata files under `container_dir`. + int64_t total_size_in_bytes = 0; + // The bytes have been transferred to drive. + int64_t bytes_transferred = 0; }; +struct PendingScreencastSetComparator { + bool operator()(const PendingScreencast& a, const PendingScreencast& b) const; +}; + +// The set to store pending screencasts. +using PendingScreencastSet = + std::set; + // Defines interface to access Browser side functionalities for the // ProjectorApp. class ProjectorAppClient { @@ -59,7 +70,7 @@ class ProjectorAppClient { // Observes the pending screencast state change events. virtual void OnScreencastsPendingStatusChanged( - const std::set& pending_screencast) = 0; + const PendingScreencastSet& pending_screencast) = 0; // Notifies the observer the SODA binary and language pack download and // installation progress. @@ -93,7 +104,7 @@ class ProjectorAppClient { const NewScreencastPrecondition& precondition) = 0; // Returns pending screencast uploaded by primary user. - virtual const std::set& GetPendingScreencasts() const = 0; + virtual const PendingScreencastSet& GetPendingScreencasts() const = 0; // Checks if device is eligible to trigger SODA installer. virtual bool ShouldDownloadSoda() = 0; @@ -117,6 +128,9 @@ class ProjectorAppClient { // language pack has finished. virtual void OnSodaInstalled() = 0; + // Triggers the opening of the Chrome feedback dialog. + virtual void OpenFeedbackDialog() = 0; + protected: ProjectorAppClient(); virtual ~ProjectorAppClient(); diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc index 2d3996be711527..16457e7201db12 100644 --- a/ash/webui/projector_app/projector_message_handler.cc +++ b/ash/webui/projector_app/projector_message_handler.cc @@ -72,8 +72,7 @@ std::string ProjectorErrorToString(ProjectorError mode) { } } -base::Value ScreencastListToValue( - const std::set& screencasts) { +base::Value ScreencastListToValue(const PendingScreencastSet& screencasts) { std::vector value; value.reserve(screencasts.size()); for (const auto& item : screencasts) @@ -208,10 +207,14 @@ void ProjectorMessageHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "setUserPref", base::BindRepeating(&ProjectorMessageHandler::SetUserPref, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "openFeedbackDialog", + base::BindRepeating(&ProjectorMessageHandler::OpenFeedbackDialog, + base::Unretained(this))); } void ProjectorMessageHandler::OnScreencastsPendingStatusChanged( - const std::set& pending_screencast) { + const PendingScreencastSet& pending_screencast) { AllowJavascript(); FireWebUIListener("onScreencastsStateChange", ScreencastListToValue(pending_screencast)); @@ -405,6 +408,13 @@ void ProjectorMessageHandler::SetUserPref( ResolveJavascriptCallback(args[0], base::Value()); } +void ProjectorMessageHandler::OpenFeedbackDialog( + const base::Value::ConstListView args) { + AllowJavascript(); + ProjectorAppClient::Get()->OpenFeedbackDialog(); + ResolveJavascriptCallback(args[0], base::Value()); +} + void ProjectorMessageHandler::OnAccessTokenRequestCompleted( const std::string& js_callback_id, const std::string& email, @@ -448,7 +458,7 @@ void ProjectorMessageHandler::GetPendingScreencasts( // Check that there is only one argument which is the callback id. DCHECK_EQ(args.size(), 1u); - const std::set& pending_screencasts = + const PendingScreencastSet& pending_screencasts = ProjectorAppClient::Get()->GetPendingScreencasts(); ResolveJavascriptCallback(args[0], ScreencastListToValue(pending_screencasts)); diff --git a/ash/webui/projector_app/projector_message_handler.h b/ash/webui/projector_app/projector_message_handler.h index 24a0538665cff0..fc784f34a5a714 100644 --- a/ash/webui/projector_app/projector_message_handler.h +++ b/ash/webui/projector_app/projector_message_handler.h @@ -55,7 +55,7 @@ class ProjectorMessageHandler : public content::WebUIMessageHandler, // Notifies the Projector SWA the pending screencasts' state change and // updates the pending list in Projector SWA. void OnScreencastsPendingStatusChanged( - const std::set& pending_screencast) override; + const PendingScreencastSet& pending_screencast) override; void OnSodaProgress(int percentage) override; void OnSodaError() override; void OnSodaInstalled() override; @@ -97,6 +97,9 @@ class ProjectorMessageHandler : public content::WebUIMessageHandler, // Requested by the Projector SWA to set the value of a user pref. void SetUserPref(const base::Value::ConstListView args); + // Requested by the Projector SWA to open the Chrome feedback dialog. + void OpenFeedbackDialog(const base::Value::ConstListView args); + // Called when OAuth token fetch request is completed by // ProjectorOAuthTokenFetcher. Resolves the javascript promise created by // ProjectorBrowserProxy.getOAuthTokenForAccount by calling the diff --git a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js index 00899bd7bf01b7..b66630497f109e 100644 --- a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js +++ b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js @@ -121,6 +121,9 @@ export class TrustedAppRequestHandler extends RequestHandler { } return this.browserProxy_.setUserPref(args[0], args[1]); }); + this.registerMethod('openFeedbackDialog', (args) => { + return this.browserProxy_.openFeedbackDialog(); + }); } } diff --git a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js index d45162bd25ed9a..088342fc29ec8f 100644 --- a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js +++ b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js @@ -144,6 +144,15 @@ const CLIENT_DELEGATE = { return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( 'setUserPref', [userPref, value]); }, + + /** + * Triggers the opening of the Chrome feedback dialog. + * @return {!Promise} + */ + openFeedbackDialog() { + return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( + 'openFeedbackDialog', []); + }, }; /** diff --git a/ash/webui/projector_app/resources/communication/projector_app.externs.js b/ash/webui/projector_app/resources/communication/projector_app.externs.js index de945148de1d88..4cae94a624e1ef 100644 --- a/ash/webui/projector_app/resources/communication/projector_app.externs.js +++ b/ash/webui/projector_app/resources/communication/projector_app.externs.js @@ -310,6 +310,13 @@ projectorApp.ClientDelegate.prototype.getUserPref = function(userPref) {}; projectorApp.ClientDelegate.prototype.setUserPref = function( userPref, value) {}; +/** + * Opens the Chrome feedback dialog. If not successful, the promise will be + * rejected with an error string. + * @return {!Promise} + */ +projectorApp.ClientDelegate.prototype.openFeedbackDialog = function() {}; + /** * The client Api for interacting with the Projector app instance. * @record @@ -350,4 +357,4 @@ projectorApp.AppApi.prototype.onSodaInstallProgressUpdated = function( /** * Notifies the Projector App when there is a SODA installation error. */ -projectorApp.AppApi.prototype.onSodaInstallError = function() {}; +projectorApp.AppApi.prototype.onSodaInstallError = function() {}; \ No newline at end of file diff --git a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js index c481ed430453a5..d76d71af53f741 100644 --- a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js +++ b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js @@ -114,6 +114,13 @@ export class ProjectorBrowserProxy { * @return {!Promise} Promise resolved when the request was handled. */ setUserPref(userPref, value) {} + + /** + * Opens the Chrome feedback dialog. The returned promise will be rejected if + * the dialog open is not successful. + * @return {!Promise} + */ + openFeedbackDialog() {} } /** @@ -186,6 +193,11 @@ export class ProjectorBrowserProxyImpl { setUserPref(userPref, value) { return sendWithPromise('setUserPref', [userPref, value]); } + + /** @override */ + openFeedbackDialog() { + return sendWithPromise('openFeedbackDialog'); + } } addSingletonGetter(ProjectorBrowserProxyImpl); diff --git a/ash/webui/projector_app/test/mock_app_client.h b/ash/webui/projector_app/test/mock_app_client.h index 36cc1ebb7e0d77..55c6157dfca4f1 100644 --- a/ash/webui/projector_app/test/mock_app_client.h +++ b/ash/webui/projector_app/test/mock_app_client.h @@ -5,7 +5,6 @@ #ifndef ASH_WEBUI_PROJECTOR_APP_TEST_MOCK_APP_CLIENT_H_ #define ASH_WEBUI_PROJECTOR_APP_TEST_MOCK_APP_CLIENT_H_ -#include #include #include "ash/webui/projector_app/projector_app_client.h" @@ -45,14 +44,14 @@ class MockAppClient : public ProjectorAppClient { MOCK_METHOD1(RemoveObserver, void(Observer*)); MOCK_METHOD1(OnNewScreencastPreconditionChanged, void(const NewScreencastPrecondition&)); - MOCK_CONST_METHOD0(GetPendingScreencasts, - const std::set&()); + MOCK_CONST_METHOD0(GetPendingScreencasts, const PendingScreencastSet&()); MOCK_METHOD0(ShouldDownloadSoda, bool()); MOCK_METHOD0(IsSpeechRecognitionAvailable, bool()); MOCK_METHOD0(InstallSoda, void()); MOCK_METHOD1(OnSodaInstallProgress, void(int)); MOCK_METHOD0(OnSodaInstallError, void()); MOCK_METHOD0(OnSodaInstalled, void()); + MOCK_METHOD0(OpenFeedbackDialog, void()); void SetAutomaticIssueOfAccessTokens(bool success); void WaitForAccessRequest(const std::string& account_email); diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc index 6bd56d464ae98a..c58a2bed477dab 100644 --- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc +++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc @@ -51,6 +51,8 @@ const char kShouldDownloadSodaCallback[] = "shouldDownloadSodaCallbck"; const char kInstallSodaCallback[] = "installSodaCallback"; const char kGetPendingScreencastsCallback[] = "getPendingScreencastsCallback"; +const char kOpenFeedbackDialogCallback[] = "openFeedbackDialog"; + const char kSetUserPrefCallback[] = "setUserPrefCallback"; const char kGetUserPrefCallback[] = "getUserPrefCallback"; @@ -336,10 +338,10 @@ TEST_F(ProjectorMessageHandlerUnitTest, InstallSoda) { } TEST_F(ProjectorMessageHandlerUnitTest, GetPendingScreencasts) { - const std::set expectedScreencasts{ - ash::PendingScreencast{ - /*container_dir*/ base::FilePath(kTestScreencastPath), - /*name*/ kTestScreencastName}}; + const PendingScreencastSet expectedScreencasts{ash::PendingScreencast{ + /*container_dir=*/base::FilePath(kTestScreencastPath), + /*name=*/kTestScreencastName, /*total_size_in_bytes=*/1, + /*bytes_untransferred=*/0}}; ON_CALL(mock_app_client(), GetPendingScreencasts()) .WillByDefault(testing::ReturnRef(expectedScreencasts)); @@ -369,8 +371,7 @@ TEST_F(ProjectorMessageHandlerUnitTest, GetPendingScreencasts) { } TEST_F(ProjectorMessageHandlerUnitTest, OnScreencastsStateChange) { - message_handler()->OnScreencastsPendingStatusChanged( - std::set()); + message_handler()->OnScreencastsPendingStatusChanged(PendingScreencastSet()); ExpectCallToWebUI(kWebUIListenerCall, "onScreencastsStateChange", /*call_count=*/1u); } @@ -440,6 +441,18 @@ TEST_F(ProjectorMessageHandlerUnitTest, SetCreationFlowEnabledInvalidValue) { EXPECT_EQ(*(rejected_args->FindPath(kRejectedRequestArgsKey)), func_args); } +TEST_F(ProjectorMessageHandlerUnitTest, OpenFeedbackDialog) { + base::ListValue list_args; + list_args.Append(base::Value(kOpenFeedbackDialogCallback)); + + web_ui().HandleReceivedMessage("openFeedbackDialog", &list_args); + base::RunLoop().RunUntilIdle(); + + const content::TestWebUI::CallData& call_data = FetchCallData(0); + EXPECT_EQ(call_data.function_name(), kWebUIResponse); + EXPECT_EQ(call_data.arg1()->GetString(), kOpenFeedbackDialogCallback); +} + TEST_F(ProjectorMessageHandlerUnitTest, SetCreationFlowEnabledUnsupportedPref) { base::ListValue list_args; list_args.Append(base::Value(kSetUserPrefCallback)); diff --git a/base/allocator/partition_alloc_support.cc b/base/allocator/partition_alloc_support.cc index 0faced346060c1..41c46996f99061 100644 --- a/base/allocator/partition_alloc_support.cc +++ b/base/allocator/partition_alloc_support.cc @@ -209,28 +209,6 @@ std::map ProposeSyntheticFinchTrials( #endif ); - // Records whether or not PartitionAlloc-Everywhere is enabled, and whether - // PCScan is enabled on top of it. This is meant for a 3-way experiment with 2 - // binaries: - // - binary A: deployed to 33% users, with PA-E and PCScan off. - // - binary B: deployed to 66% users, with PA-E on, half of which having - // PCScan on - // - // NOTE, deliberately don't use PA_ALLOW_PCSCAN which depends on bitness. - // In the 32-bit case, PCScan is always disabled, but we'll deliberately - // misrepresent it as enabled here (and later ignored when analyzing results), - // in order to keep each population at 33%. - trials.emplace( - "PartitionAllocEverywhereAndPCScan", -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - FeatureList::IsEnabled(features::kPartitionAllocPCScanBrowserOnly) - ? "EnabledWithPCScan" - : "EnabledWithoutPCScan" -#else - "Disabled" -#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - ); - #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) // BackupRefPtr_Effective and PCScan_Effective record whether or not // BackupRefPtr and/or PCScan are enabled. The experiments aren't independent, diff --git a/base/json/json_file_value_serializer.h b/base/json/json_file_value_serializer.h index e2479aa401e428..265feddfee5859 100644 --- a/base/json/json_file_value_serializer.h +++ b/base/json/json_file_value_serializer.h @@ -65,17 +65,23 @@ class BASE_EXPORT JSONFileValueDeserializer : public base::ValueDeserializer { ~JSONFileValueDeserializer() override; - // Attempt to deserialize the data structure encoded in the file passed - // in to the constructor into a structure of Value objects. If the return - // value is NULL, and if |error_code| is non-null, |error_code| will - // contain an integer error code (either JsonFileError or JsonParseError). - // If |error_message| is non-null, it will be filled in with a formatted - // error message including the location of the error if appropriate. + // Attempts to deserialize the data structure encoded in the file passed to + // the constructor into a structure of Value objects. If the return value is + // null, then + // (1) |error_code| will be filled with an integer error code (either a + // JsonFileError or base::ValueDeserializer::kErrorCodeInvalidFormat) if a + // non-null |error_code| was given. + // (2) |error_message| will be filled with a formatted error message, + // including the location of the error (if appropriate), if a non-null + // |error_message| was given. // The caller takes ownership of the returned value. std::unique_ptr Deserialize(int* error_code, std::string* error_message) override; - // This enum is designed to safely overlap with JSONReader::JsonParseError. + // This enum is designed to safely overlap with JSONParser::JsonParseError. + // + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. enum JsonFileError { JSON_NO_ERROR = 0, JSON_ACCESS_DENIED = kErrorCodeFirstMetadataError, diff --git a/base/json/json_string_value_serializer.h b/base/json/json_string_value_serializer.h index 27be85279c55a5..5255c1ac198337 100644 --- a/base/json/json_string_value_serializer.h +++ b/base/json/json_string_value_serializer.h @@ -62,12 +62,14 @@ class BASE_EXPORT JSONStringValueDeserializer : public base::ValueDeserializer { ~JSONStringValueDeserializer() override; - // Attempt to deserialize the data structure encoded in the string passed - // in to the constructor into a structure of Value objects. If the return - // value is null, and if |error_code| is non-null, |error_code| will - // contain an integer error code (a JsonParseError in this case). - // If |error_message| is non-null, it will be filled in with a formatted - // error message including the location of the error if appropriate. + // Attempts to deserialize |json_string_| into a structure of Value objects. + // If the return value is null, then + // (1) |error_code| will be filled with an integer error code + // (base::ValueDeserializer::kErrorCodeInvalidFormat) if a non-null + // |error_code| was given. + // (2) |error_message| will be filled with a formatted error message, + // including the location of the error (if appropriate), if a non-null + // |error_message| was given. // The caller takes ownership of the returned value. std::unique_ptr Deserialize(int* error_code, std::string* error_message) override; diff --git a/base/values.h b/base/values.h index 7a076c94b27346..6e8ecb8ced4d09 100644 --- a/base/values.h +++ b/base/values.h @@ -863,6 +863,9 @@ class BASE_EXPORT ValueDeserializer { // - Values 1000 and above mean an error in the metadata (i.e. context). The // file could not be read, the network is down, etc. // - Negative values are reserved. + // + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. enum ErrorCode { kErrorCodeNoError = 0, // kErrorCodeInvalidFormat is a generic error code for "the data is not in diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index d25fb92dc30896..982bf27f0f57d0 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1 @@ -1 +1 @@ -7.20211215.3.1 +7.20211216.2.1 diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index d25fb92dc30896..982bf27f0f57d0 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1 @@ -1 +1 @@ -7.20211215.3.1 +7.20211216.2.1 diff --git a/chrome/VERSION b/chrome/VERSION index 5168e1d04fdf91..a7808bdedefeb3 100644 --- a/chrome/VERSION +++ b/chrome/VERSION @@ -1,4 +1,4 @@ MAJOR=99 MINOR=0 -BUILD=4771 +BUILD=4772 PATCH=0 diff --git a/chrome/android/java/res/values-night/drawables.xml b/chrome/android/java/res/values-night/drawables.xml index fdc0eb2e27be5c..25bfe0563a55aa 100644 --- a/chrome/android/java/res/values-night/drawables.xml +++ b/chrome/android/java/res/values-night/drawables.xml @@ -3,5 +3,7 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> + @drawable/badge_update_light + @drawable/ic_error_white_24dp_filled @drawable/shared_clipboard_zero_state_dark diff --git a/chrome/android/java/res/values/drawables.xml b/chrome/android/java/res/values/drawables.xml index 1eb1c4abeb6b3e..8569b73d402aa6 100644 --- a/chrome/android/java/res/values/drawables.xml +++ b/chrome/android/java/res/values/drawables.xml @@ -6,5 +6,7 @@ @drawable/rounded_rectangle_surface_1 @drawable/modern_toolbar_text_box_background + @drawable/badge_update_dark + @drawable/ic_error_grey800_24dp_filled @drawable/shared_clipboard_zero_state_light diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res/values/styles.xml index f044866415a6d0..e5e65088243db2 100644 --- a/chrome/android/java/res/values/styles.xml +++ b/chrome/android/java/res/values/styles.xml @@ -125,7 +125,7 @@ @macro/default_text_color_link @android:color/black @macro/default_control_color_active - @macro/default_control_color_highlight + @color/control_highlight_color @style/SpinnerStyle @style/Widget.BrowserUI.TextInputLayout diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java index 7d0ce4d15df069..26a2606beabed5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java @@ -8,7 +8,7 @@ import android.widget.CompoundButton; import androidx.annotation.Nullable; -import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.content.res.ResourcesCompat; import org.chromium.base.Callback; import org.chromium.base.CallbackController; @@ -171,9 +171,10 @@ void setPriceTrackingNotificationUiEnabled(boolean enabled) { void setPriceTrackingIconForEnabledState(boolean enabled) { mPropertyModel.set(BookmarkSaveFlowProperties.NOTIFICATION_SWITCH_START_ICON, - AppCompatResources.getDrawable(mContext, + ResourcesCompat.getDrawable(mContext.getResources(), enabled ? R.drawable.price_tracking_enabled_filled - : R.drawable.price_tracking_disabled)); + : R.drawable.price_tracking_disabled, + /*theme=*/null)); } void destroy() { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java index 0a3da975789f28..3f4fb8a680cac6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java @@ -229,7 +229,6 @@ private void handleStateChanged() { R.string.accessibility_toolbar_btn_menu_update; mMenuUiState.buttonState.darkBadgeIcon = R.drawable.badge_update_dark; mMenuUiState.buttonState.lightBadgeIcon = R.drawable.badge_update_light; - mMenuUiState.buttonState.adaptiveBadgeIcon = R.drawable.badge_update; } mMenuUiState.itemState = new MenuItemState(); @@ -259,7 +258,6 @@ private void handleStateChanged() { mMenuUiState.buttonState.darkBadgeIcon = R.drawable.ic_error_grey800_24dp_filled; mMenuUiState.buttonState.lightBadgeIcon = R.drawable.ic_error_white_24dp_filled; - mMenuUiState.buttonState.adaptiveBadgeIcon = R.drawable.ic_error_24dp_filled; } mMenuUiState.itemState = new MenuItemState(); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java index f0d145cd37312b..56f14422d60041 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java @@ -5,15 +5,12 @@ package org.chromium.chrome.browser.toolbar; import android.content.Context; -import android.content.res.ColorStateList; import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider.IncognitoStateObserver; import org.chromium.chrome.browser.theme.ThemeColorProvider; -import org.chromium.chrome.browser.theme.ThemeUtils; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; /** A ThemeColorProvider for the app theme (incognito or standard theming). */ @@ -94,12 +91,6 @@ private void updateTheme() { updatePrimaryColor( shouldUseIncognitoBackground ? mIncognitoPrimaryColor : mStandardPrimaryColor, false); - final @BrandedColorScheme int brandedColorScheme = shouldUseIncognitoBackground - ? BrandedColorScheme.INCOGNITO - : BrandedColorScheme.APP_DEFAULT; - final ColorStateList iconTint = - ThemeUtils.getThemedToolbarIconTint(mActivityContext, brandedColorScheme); - updateTint(iconTint, brandedColorScheme); } @Override 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 544e29ef05dee1..1be1aae254f4a1 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 @@ -138,7 +138,6 @@ import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.native_page.NativePage; import org.chromium.chrome.browser.ui.system.StatusBarColorController; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.user_education.UserEducationHelper; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.browser.vr.VrModuleProvider; @@ -1657,9 +1656,8 @@ public void onThemeColorChanged(int color, boolean shouldAnimate) { } @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { updateBookmarkButtonStatus(); - mCustomTabThemeColorProvider.setTint(tint, brandedColorScheme); } /** diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java index 3bd461e6c81f29..655f1d5a558d2d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java @@ -116,7 +116,6 @@ import org.chromium.chrome.browser.toolbar.menu_button.MenuButton; import org.chromium.chrome.browser.ui.appmenu.AppMenuCoordinator; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeTabUtils; @@ -419,10 +418,8 @@ public void testToolbarColor() { } MenuButton menuButtonView = toolbarView.findViewById(R.id.menu_button_wrapper); - assertEquals(ColorUtils.shouldUseLightForegroundOnBackground(expectedColor) - ? BrandedColorScheme.DARK_BRANDED_THEME - : BrandedColorScheme.LIGHT_BRANDED_THEME, - menuButtonView.getBrandedColorSchemeForTesting()); + assertEquals(menuButtonView.getUseLightDrawablesForTesting(), + ColorUtils.shouldUseLightForegroundOnBackground(expectedColor)); } /** diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java index f157a28dee3b83..26f5336c7e77b4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java @@ -15,7 +15,7 @@ import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.Matchers.not; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -205,7 +205,7 @@ private void setupSearchEngineLogo(String url) { }; doAnswer(logoAnswer) .when(mSearchEngineLogoUtils) - .getSearchEngineLogo(any(), anyInt(), any(), any(), any()); + .getSearchEngineLogo(any(), anyBoolean(), any(), any(), any()); }); } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java index 36aafff6687b28..6052c7d7c9af6f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java @@ -48,7 +48,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconResource; import org.chromium.chrome.browser.omnibox.status.StatusView.IconTransitionType; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; 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; @@ -131,7 +130,7 @@ public void setUp() { doAnswer(logoAnswer) .when(mSearchEngineLogoUtils) .getSearchEngineLogo( - eq(mResources), eq(BrandedColorScheme.APP_DEFAULT), any(), any(), any()); + eq(mResources), /* inNightMode= */ eq(false), any(), any(), any()); mBitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888); setupStatusMediator(/* isTablet= */ false); @@ -435,21 +434,21 @@ public void testStatusText() { Assert.assertEquals("Incorrect color for paint preview status text", R.color.locationbar_status_preview_color_light, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); - mMediator.setBrandedColorScheme(BrandedColorScheme.LIGHT_BRANDED_THEME); + mMediator.setUseDarkColors(true); Assert.assertEquals("Incorrect color for paint preview status text", R.color.locationbar_status_preview_color, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); // When only offline is enabled, it should be shown. mMediator.setPageIsPaintPreview(false); - mMediator.setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + mMediator.setUseDarkColors(false); Assert.assertEquals("Incorrect text for offline page status text", R.string.location_bar_verbose_status_offline, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_STRING_RES)); Assert.assertEquals("Incorrect color for offline page status text", R.color.locationbar_status_offline_color_light, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); - mMediator.setBrandedColorScheme(BrandedColorScheme.LIGHT_BRANDED_THEME); + mMediator.setUseDarkColors(true); Assert.assertEquals("Incorrect color for offline page status text", R.color.locationbar_status_offline_color, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); @@ -468,7 +467,7 @@ public void testTemplateUrlServiceChanged() { mMediator.onTemplateURLServiceChanged(); verify(mSearchEngineLogoUtils, times(3)) .getSearchEngineLogo( - eq(mResources), eq(BrandedColorScheme.APP_DEFAULT), any(), any(), any()); + eq(mResources), /* inNightMode= */ eq(false), any(), any(), any()); } @Test diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java index f58067656168e3..adf71d2b17f091 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java @@ -4,7 +4,6 @@ package org.chromium.chrome.browser.customtabs; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -29,7 +28,6 @@ import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.toolbar.menu_button.MenuButton; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.display.DisplayAndroidManager; /** @@ -72,8 +70,7 @@ public void testLaunchCustomTabWithColorSchemeDark() { assertTrue(activity.getNightModeStateProviderForTesting().isInNightMode()); MenuButton menuButtonView = activity.findViewById(R.id.menu_button_wrapper); - assertEquals(BrandedColorScheme.APP_DEFAULT, - menuButtonView.getBrandedColorSchemeForTesting()); + assertTrue(menuButtonView.getUseLightDrawablesForTesting()); }); } @@ -88,8 +85,7 @@ public void testLaunchCustomTabWithColorSchemeLight() { assertFalse(activity.getNightModeStateProviderForTesting().isInNightMode()); MenuButton menuButtonView = activity.findViewById(R.id.menu_button_wrapper); - assertEquals(BrandedColorScheme.APP_DEFAULT, - menuButtonView.getBrandedColorSchemeForTesting()); + assertFalse(menuButtonView.getUseLightDrawablesForTesting()); }); } diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index 66adbfd7e71946..c7c2ea2706999e 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb @@ -111,6 +111,7 @@ Sommige kenmerke kan dalk nie beskikbaar wees nie en veranderings aan voorkeure Kry hulp met Chromium Kon weens 'n ongespesifiseerde fout nie installeer nie. As Chromium tans loop, maak dit asseblief toe en probeer weer. Verlaat Chromium in elk geval? +Pasmaak die privaatheidkeuses wat Chromium as die belangrikste beskou. Hierdie gids sluit nie elke instelling en opsie in nie. Laat Chromium in die agtergrond loop Pasmaak en beheer Chromium Verbeterde beskerming doen meer om uitvissing en wanware te blokkeer @@ -298,5 +299,6 @@ Chromium kan nie jou instellings herwin nie. Chromium OS-bedryfstelsel Chromium sal dalk nie reg werk nie omdat dit nie meer in Windows XP en Windows Vista gesteun word nie Wie gebruik tans Chromium? +Kry Chromium se sterkste sekuriteit Die Chromium-outeurs \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index bcad9360f8632b..032a663814ee1a 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb @@ -235,6 +235,7 @@ Bəzi funksiyalar əlçatmaz ola bilər. Xüsusi profil direktoriyası göstəri Chromium'dan datanı silin () Ayar bu səhifədə göstərilməsə, Chromium OS ayarlarına baxın +Hesabınızda Qabaqcıl Güvənli Baxışı aktiv etdiniz. İndi onu Chromium üçün əldə edin. Chromium kameranızı və mikrofonunuzu işlədir. Chromium daha da keyfiyyətli oldu Chromium defolt brauzeriniz deyil diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index c4e4b2adf19981..84dc83b2e54fe5 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb @@ -111,6 +111,7 @@ Атрымаць дапамогу па Chromium Збой усталявання з-за нявызначанай памылкі. Калі Chromium зараз запушчаны, закрыйце яго і паўтарыце спробу. Усё роўна выйсці з Chromium? +Наладзьце найбольш важныя параметры прыватнасці Chromium. У гэтым дапаможніку ўказаны не ўсе налады і параметры. Дазволіць браўзеру Chromium працаваць у фоне Наладка і кіраванне Chromium Функцыя палепшанай абароны яшчэ надзейней блакіруе фішынг і шкодныя праграмы @@ -297,5 +298,6 @@ Сістэма Chromium OS Браўзер Chromium больш не падтрымліваецца на Windows XP і Windows Vista, таму можа працаваць няправільна Хто выкарыстоўвае Chromium? +Засцеражыце браўзер Chromium ад небяспек Аўтары Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index fa921960950310..89e1ec6f924ae9 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb @@ -240,6 +240,7 @@ Chromium ne može vratiti vaše postavke. Obriši i podatke iz Chromiuma () Ako se postavka ne prikazuje na ovoj stranici, pogledajte u postavkama Chromium OS-a +Uključili ste poboljšano sigurno pregledavanje na svom računu. Sada ga omogućite za Chromium. Chromium koristi vašu kameru i mikrofon. Chromium je sada još bolji Chromium nije vaš zadani preglednik diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index 43d188bc8c9e47..57d25c733b24cc 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb @@ -111,6 +111,7 @@ Některé funkce možná nebudou k dispozici a změny nastavení se neuloží.Pomoc s prohlížečem Chromium Došlo k nespecifikované chybě, instalace se nezdařila. Pokud je prohlížeč Chromium právě spuštěný, zavřete jej prosím a zkuste to znovu. Přesto Chromium ukončit? +Přizpůsobte si nastavení ochrany soukromí, která jsou v prohlížeči Chromium nejdůležitější. Tento průvodce nezahrnuje všechna nastavení a možnosti. Nechat Chromium běžet na pozadí Přizpůsobit a ovládat Chromium Vylepšená ochrana vás lépe ochrání před phishingem a malwarem @@ -297,5 +298,6 @@ Chromium nemůže vaše nastavení obnovit. Systém Chromium OS Prohlížeč Chromium nemusí fungovat správně, protože v systémech Windows XP a Windows Vista již není podporován Kdo Chromium používá? +Aktivujte si v prohlížeči Chromium maximální zabezpečení Autoři prohlížeče Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index d13c442ce87d5e..ca2374d7f84a0f 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb @@ -109,6 +109,7 @@ Få hjælp til Chromium Installationen mislykkedes på grund af en ikke-specificeret fejl. Hvis Chromium kører, skal du lukke programmet og prøve igen. Vil du afslutte Chromium alligevel? +Tilpas de privatlivsindstillinger, som Chromium anser for at være de vigtigste. Denne vejledning gennemgår ikke alle indstillinger og valgmuligheder. Lad Chromium køre i baggrunden Tilpas og kontrollér Chromium Forbedret beskyttelse gør mere end at blokere phishing og malware @@ -296,5 +297,6 @@ Chromium kan ikke gendanne dine præferencer. Chromium OS-system Chromium fungerer muligvis ikke korrekt på grund af manglende understøttelse i Windows XP og Windows Vista Hvem bruger Chromium? +Få Chromiums stærkeste beskyttelse Forfatterne til Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 07b9a1871fdc5a..09475f8e6f81a7 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb @@ -109,6 +109,7 @@ Hilfe für Chromium aufrufen Die Installation konnte aufgrund eines undefinierten Fehlers nicht abgeschlossen werden. Falls Chromium derzeit ausgeführt wird, schließen Sie es bitte und versuchen Sie es erneut. Chromium trotzdem beenden? +Sie können die wichtigsten Datenschutzeinstellungen von Chromium anpassen. In dieser Anleitung werden nicht alle Einstellungen und Optionen behandelt. Chromium im Hintergrund ausführen Chromium anpassen und einstellen Besserer Schutz vor Phishing und Malware durch erweitertes Safe Browsing @@ -294,5 +295,6 @@ Chromium kann Ihre Einstellungen nicht wiederherstellen. Chromium OS-System Chromium funktioniert unter Umständen nicht ordnungsgemäß, da es unter Windows XP und Windows Vista nicht mehr unterstützt wird Wer verwendet gerade Chromium? +Höchste Sicherheit in Chromium erhalten Die Chromium-Autoren \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index 24ac6f396917ad..c4a487a05e7a91 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb @@ -238,6 +238,7 @@ Επίσης, να διαγραφούν δεδομένα από το Chromium () Εάν μια ρύθμιση δεν εμφανίζεται σε αυτήν τη σελίδα, αναζητήστε την στις ρυθμίσεις του Chromium OS +Ενεργοποιήσατε τη Βελτιωμένη Ασφαλή περιήγηση στον λογαριασμό σας. Τώρα, αποκτήστε τη για το Chromium. Το Chromium χρησιμοποιεί την κάμερα και το μικρόφωνό σας. Το Chromium έγινε ακόμα καλύτερο Το Chromium δεν είναι το προεπιλεγμένο πρόγραμμα περιήγησης diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 0686c20678f562..5f1ee582388947 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb @@ -239,6 +239,7 @@ Google Chrome is unable to recover your settings. Also clear data from Chromium () If a setting doesn't show on this page, look in your Chromium OS settings +You turned on Enhanced Safe Browsing in your account. Now get it for Chromium. Chromium is using your camera and microphone. Chromium just got better Chromium isn't your default browser diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 765f10e5b2ff7d..990819099cfd13 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb @@ -107,6 +107,7 @@ Obtener ayuda con Chromium No se pudo completar la instalación debido a un error no identificado. Si Chromium se está ejecutando en este momento, ciérralo e intenta nuevamente. ¿Deseas salir de Chromium de todos modos? +Personaliza las opciones de privacidad más importantes de Chromium. Esta guía no incluye todas las opciones ni los parámetros de configuración. Permitir que Chromium se ejecute en segundo plano Personaliza y controla Chromium La protección mejorada permite bloquear mejor la suplantación de identidad (phishing) y el software malicioso. @@ -290,5 +291,6 @@ Sistema de Chromium OS Es posible que Chromium no funcione correctamente porque ya no es compatible con Windows XP ni Windows Vista ¿Quién usa Chromium? +Obtén la seguridad más sólida de Chromium Los creadores de Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index fd54488b2481b0..023a02a9f5b6c6 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb @@ -111,6 +111,7 @@ Es posible que algunas funciones no estén disponibles y que no se guarden los c Obtener ayuda de Chromium La instalación ha fallado debido a un error no especificado. Si Chromium se está ejecutando, ciérralo y vuelve a intentarlo. ¿Quieres salir de Chromium de todas formas? +Personaliza las opciones de privacidad que Chromium considera más importantes. En esta guía, no se incluyen todos los ajustes y opciones. Permitir que Chromium se ejecute en segundo plano Personaliza y controla Chromium La protección mejorada es más eficaz para bloquear ataques de suplantación de identidad y software malicioso. @@ -298,5 +299,6 @@ Chromium no puede recuperar tu configuración. Sistema Chromium OS Es posible que Chromium no funcione correctamente porque ya no es compatible con Windows XP ni Windows Vista ¿Quién usa Chromium? +Consigue la seguridad más potente de Chromium Los creadores de Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index cb245746f58528..1189e6713453ed 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb @@ -109,6 +109,7 @@ Chromiumi puhul abi hankimine Installimine ebaõnnestus tundmatu vea tõttu. Kui Chromium praegu töötab, siis sulgege see ja proovige uuesti. Kas väljuda Chromiumist ikkagi? +Kohandage privaatsusvalikuid, mida Chromium peab kõige olulisemaks. See juhend ei hõlma igat seadet ja valikut. Luba Chromiumil taustal töötada Chromiumi kohandamine ja juhtimine Täiustatud kaitse aitab andmepüüki ja pahavara paremini blokeerida @@ -295,5 +296,6 @@ Chromium ei saa teie seadeid taastada. Chromium OS-i süsteem Chromium ei pruugi õigesti töötada, kuna seda ei toetata enam Windows XP-s ega Windows Vistas Kes kasutab Chromiumi? +Hankige Chromiumi parimad turbefunktsioonid The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 7d20e64d527c1f..81042b8baa59d2 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb @@ -109,6 +109,7 @@ Ohjeita Chromiumin käyttöön Asennus epäonnistui tuntemattoman virheen takia. Jos Chromium on tällä hetkellä käynnissä, sulje se ja yritä uudelleen. Suljetaanko Chromium silti? +Muuta yksityisyysvalintoja, jotka ovat Chromiumin mukaan kaikista tärkeimpiä. Tässä oppaassa ei ole ohjeita jokaisesta asetuksesta tai vaihtoehdosta. Jätä Chromium käyntiin taustalle Chromiumin muokkaus ja hallinta Parannettu suojaus torjuu tietojenkalastelua ja haittaohjelmia entistä tehokkaammin @@ -296,5 +297,6 @@ Chromium ei voi palauttaa asetuksiasi. Chromium-käyttöjärjestelmä Chromium ei välttämättä toimi oikein, koska se ei enää tue Windows XP:tä tai Windows Vistaa. Kuka käyttää Chromiumia? +Ota Chromiumin tehokkain suojaus käyttöön The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index 2540b49f942424..35f5980010d934 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb @@ -110,6 +110,7 @@ Certaines fonctionnalités ne seront peut-être pas disponibles, et les modifica Obtenir de l'aide avec Chromium Échec de l'installation suite à une erreur non spécifiée. Si Chromium est en cours d'exécution, veuillez le fermer, puis réessayer. Quitter Chromium quand même ? +Personnalisez les paramètres de confidentialité que Chromium considère comme les plus importants. Ce guide n'inclut ni tous les paramètres, ni toutes les options. Laisser Chromium s'exécuter en arrière-plan Personnaliser et contrôler Chromium La protection renforcée assure une meilleure protection contre l'hameçonnage et les logiciels malveillants @@ -296,5 +297,6 @@ Chromium ne peut pas récupérer vos paramètres. Système Chromium OS Chromium risque de ne pas fonctionner correctement, car la compatibilité n'est plus assurée sur Windows XP et Windows Vista Qui utilise Chromium ? +Renforcer la sécurité de Chromium Auteurs de Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 6aa2d4bd2e981a..06c90dae4b8df1 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb @@ -109,6 +109,7 @@ Potraži pomoć za upotrebu Chromiuma Instalacija nije uspjela zbog nepoznate pogreške. Ako je Chromium trenutačno otvoren, zatvorite ga i pokušajte ponovo. Želite li ipak zatvoriti Chromium? +Prilagodite odabire u vezi s privatnošću koje Chromium smatra najvažnijima. Ovaj vodič ne sadrži sve postavke i opcije. Neka Chromium radi u pozadini Prilagodite Chromium i upravljajte njime Poboljšana zaštita blokira krađu identiteta i zlonamjerni softver na više načina @@ -237,6 +238,7 @@ Chromium ne može oporaviti vaše postavke. Izbriši i podatke s Chromiuma () Ako se postavka ne prikazuje na ovoj stranici, pogledajte postavke OS-a Chromium +Uključili ste poboljšano sigurno pregledavanje na svom računu. Sada ga omogućite za Chromium. Chromium upotrebljava vašu kameru i mikrofon. Chromium je upravo postao bolji Chromium nije vaš zadani preglednik @@ -296,5 +298,6 @@ Chromium ne može oporaviti vaše postavke. OS Chromium Chromium možda neće ispravno raditi jer više nije podržan na sustavima Windows XP i Windows Vista Tko upotrebljava Chromium? +Odaberite najsnažniju Chromiumovu zaštitu sigurnosti Autori Chromiuma \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index aa7d9e89158c1c..9941389b8142c0 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb @@ -109,6 +109,7 @@ Dapatkan bantuan Chromium Pemasangan gagal karena kesalahan yang tidak diketahui. Jika Chromium sedang berjalan, tutup, lalu ulang kembali. Tetap keluar dari Chromium? +Sesuaikan pilihan privasi yang dianggap paling penting oleh Chromium. Panduan ini tidak mencakup semua setelan dan opsi. Jalankan Chromium di Background Menyesuaikan dan mengontrol Chromium Perlindungan yang ditingkatkan akan memblokir phishing dan malware dengan lebih optimal @@ -296,5 +297,6 @@ Chromium tidak dapat memulihkan setelan Anda. Sistem Chromium OS Chromium mungkin tidak berfungsi dengan semestinya karena sudah tidak didukung di Windows XP atau Windows Vista Siapa yang menggunakan Chromium? +Dapatkan keamanan terkuat Chromium Pengarang Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index df14c63a668d1e..20a07480772cf1 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb @@ -109,6 +109,7 @@ Ricevi assistenza per Chromium Installazione non riuscita a causa di un errore imprecisato. Se Chromium è in esecuzione, chiudilo e riprova. Vuoi uscire comunque da Chromium? +Personalizza le opzioni relative alla privacy considerate più importanti da Chromium. Questa guida non include tutte le impostazioni e opzioni. Lascia Chromium in esecuzione in background Personalizza e controlla Chromium La protezione avanzata blocca malware e tentativi di phishing con maggiore efficacia @@ -235,6 +236,7 @@ Chromium non è in grado di recuperare le impostazioni. Informazioni su Chromium OS Cancella anche i dati di Chromium () Se un'impostazione non viene mostrata in questa pagina, cercala nelle impostazioni del sistema operativo Chromium. +Hai attivato la Navigazione sicura avanzata nel tuo account. Ora attivala per Chromium. Chromium sta utilizzando videocamera e microfono. Da oggi Chromium è ancora meglio Chromium non è il browser predefinito @@ -294,5 +296,6 @@ Chromium non è in grado di recuperare le impostazioni. Sistema Chromium OS Chromium potrebbe non funzionare correttamente perché non è più supportato su Windows XP o Windows Vista Chi usa Chromium? +Usa la funzionalità di sicurezza più efficace di Chromium The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 8cec5a12af063d..751191db24e6a4 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb @@ -107,6 +107,7 @@ ‏עזרה בנושא Chromium ‏ההתקנה נכשלה בשל שגיאה לא צפויה. אם Chromium פועל כעת, יש לסגור אותו ולנסות שוב. ‏לסגור את Chromium בכל זאת? +‏התאמה אישית של העדפות הפרטיות הכי חשובות מבחינת Chromium. המדריך הזה לא כולל את כל ההגדרות והאפשרויות. ‏Chromium יכול לפעול ברקע ‏התאמה אישית ושליטה ב-Chromium עם ההגנה המשופרת, החסימה של פישינג ותוכנות זדוניות מקיפה יותר @@ -294,5 +295,6 @@ Chromium לא יכול לשחזר את ההגדרות שלך. ‏מערכת Chromium OS ‏ייתכן ש-Chromium לא יפעל כראוי כי הוא כבר לא נתמך ב-Windows XP וב-Windows Vista ‏מי משתמש/ת ב-Chromium? +‏רוצה להשיג את רמת האבטחה הגבוהה ביותר של Chromium? ‏מחברי Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index 8d872b1de3e8eb..9b5f03ff55e639 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb @@ -111,6 +111,7 @@ Chromium 도움말 보기 확인되지 않은 오류로 설치에 실패했습니다. Chromium이 실행 중인 경우 종료한 후 다시 실행하세요. Chromium을 종료하시겠습니까? +Chromium에서 가장 중요하게 간주되는 개인 정보 보호 항목을 맞춤설정합니다. 이 가이드에서 다루지 않는 설정과 옵션도 있습니다. 백그라운드에서 Chromium을 실행 Chromium 맞춤설정 및 제어 향상된 보호 기능이 피싱 및 멀웨어를 더욱 효과적으로 차단합니다. @@ -298,5 +299,6 @@ Chromium에서 설정을 복구할 수 없습니다. Chromium OS 시스템 Windows XP 또는 Windows Vista에서 더 이상 Chromium을 지원하지 않으므로 Chromium이 올바르게 작동하지 않을 수 있습니다 Chromium 사용자 선택 +Chromium의 가장 강력한 보안 기능을 이용하세요 The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index d7e2dcab4b5485..d78e17e77936fa 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb @@ -109,6 +109,7 @@ Saņemt palīdzību par Chromium Instalācija neizdevās nenoteiktas kļūdas dēļ. Ja Chromium šobrīd darbojas, aizveriet to un mēģiniet vēlreiz. Vai tik un tā aizvērt pārlūku Chromium? +Pielāgojiet Chromium vissvarīgākos konfidencialitātes iestatījumus. Šajā ceļvedī nav iekļauti visi iestatījumi un opcijas. Ļaut pārlūkam Chromium darboties fonā Pielāgot un kontrolēt Chromium Uzlabotā aizsardzība labāk bloķē pikšķerēšanas mēģinājumus un ļaunprātīgu programmatūru @@ -293,5 +294,6 @@ Dažas funkcijas var nebūt pieejamas. Norādiet citu profila direktoriju vai iz Chromium OS sistēma Iespējams, Chromium nedarbosies pareizi, jo tas vairs netiek atbalstīts operētājsistēmās Windows XP un Windows Vista. Kas izmanto pārlūku Chromium? +Visaugstākais Chromium drošības līmenis Chromium autori \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index 85ea65696684f0..418a97a35eaf91 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb @@ -239,6 +239,7 @@ Chromium не може да ги обнови вашите поставки.Избриши ги и податоците од Chromium () Ако некоја поставка не се прикажува на страницава, погледнете во поставките за Chromium OS +Вклучивте „Подобрено безбедно прелистување“ во вашата сметка. Сега вклучете го за Chromium. Chromium ги користи фотоапаратот и микрофонот. Chromium е подобрен Chromium не е вашиот стандарден прелистувач diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index fc05b052f8906d..62f3707f4b0ad8 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb @@ -240,6 +240,7 @@ Chromium-ൽ നിന്നും ഡാറ്റ മായ്ക്കുക () ഈ പേജിൽ ക്രമീകരണം കാണിക്കുന്നില്ലെങ്കിൽ Chromium OS ക്രമീകരണത്തിൽ പരിശോധിക്കുക +നിങ്ങളുടെ അക്കൗണ്ടിൽ മെച്ചപ്പെടുത്തിയ സുരക്ഷിത ബ്രൗസിംഗ് ഓണാക്കിയിരിക്കുന്നു. ഇപ്പോൾ അത് Chromium-ലും നേടൂ. Chromium നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു. Chromium കൂടുതൽ മികച്ചതായി Chromium നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറല്ല diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index 205fbd700d2413..8c0b0ad5373fa5 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb @@ -109,6 +109,7 @@ Dapatkan bantuan berkenaan Chromium Pemasangan gagal disebabkan ralat yang tidak dinyatakan. Jika Chromium sedang dijalankan, sila tutup dan cuba semula. Keluar daripada Chromium juga? +Sesuaikan pilihan privasi yang dianggap paling penting oleh Chromium. Panduan ini tidak merangkumi setiap tetapan dan pilihan. Benarkan Chromium Dijalankan dalam Latar Belakang Sesuaikan dan kawal Chromium Perlindungan yang dipertingkatkan melakukan pelbagai lagi perkara untuk menyekat pancingan data dan perisian hasad @@ -296,5 +297,6 @@ Chromium tidak dapat mengembalikan tetapan anda. Sistem OS Chromium Chromium mungkin tidak akan berfungsi dengan betul kerana tidak lagi disokong pada Windows XP atau Windows Vista Siapakah yang sedang menggunakan Chromium? +Dapatkan keselamatan Chromium yang paling kukuh Pengarang Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index e721b13121e8f9..010c9870a46fef 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb @@ -111,6 +111,7 @@ Sommige functies zijn wellicht niet beschikbaar en wijzigingen in voorkeuren wor Hulp bij Chromium De installatie is mislukt wegens een onbekende fout. Als Chromium momenteel actief is, moet je Chromium sluiten en het opnieuw proberen. Chromium toch sluiten? +Pas de privacykeuzes aan die Chromium het belangrijkst vindt. Deze gids bevat niet alle instellingen en opties. Chromium laten uitvoeren op de achtergrond Chromium aanpassen en beheren Geoptimaliseerde beveiliging die je nog beter beschermt tegen phishing en malware @@ -237,6 +238,7 @@ Chromium kan je instellingen niet herstellen. Over Chromium OS Ook gegevens van Chromium wissen () Kijk je in de Chromium OS-instellingenals je een instelling niet ziet op deze pagina. +Je hebt de uitgebreide versie van Safe Browsing aangezet in je account. Zet deze functie nu ook aan voor Chromium. Chromium gebruikt je camera en microfoon. Chromium is nu nog beter Chromium is niet je standaardbrowser @@ -296,5 +298,6 @@ Chromium kan je instellingen niet herstellen. Chromium OS-systeem Chromium werkt mogelijk niet naar behoren omdat dit niet langer wordt ondersteund op Windows XP en Windows Vista Wie gebruikt Chromium? +Gebruik het hoogste beveiligingsniveau van Chromium De auteurs van Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb index c5e49220241b38..45e5e1e176157b 100644 --- a/chrome/app/resources/chromium_strings_or.xtb +++ b/chrome/app/resources/chromium_strings_or.xtb @@ -111,6 +111,7 @@ Chromium ପାଇଁ ସାହାଯ୍ୟ ପ୍ରାପ୍ତ କରନ୍ତୁ ଅନିର୍ଦ୍ଧିଷ୍ଟ ତ୍ରୁଟି ହେତୁ ଇନ୍‍ଷ୍ଟଲେସନ୍‍ ବିଫଳ ହୋ‍ଇଛି। ଯଦି ଏବେ Chromium ଚାଲୁଛି, ତେବେ ଦୟାକରି ଏହାକୁ ବନ୍ଦ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ। ଯେକୌଣସିମତେ Chromiumରୁ ବାହାରିବେ? +Chromium ସବୁଠାରୁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବୋଲି ବିଚାର କରୁଥିବା ଗୋପନୀୟତା ସମ୍ବନ୍ଧିତ ବିକଳ୍ପଗୁଡ଼ିକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ। ଏହି ଗାଇଡରେ ପ୍ରତ୍ୟେକ ସେଟିଂ ଏବଂ ବିକଳ୍ପ ଅନ୍ତର୍ଭୁକ୍ତ ନାହିଁ। ପୃଷ୍ଠପଟରେ Chromiumକୁ ଚାଲିବାକୁ ଦିଅନ୍ତୁ Chromium କଷ୍ଟମାଇଜ୍ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ ଉନ୍ନତ ସୁରକ୍ଷା ଫିସିଂ ଓ ମାଲୱେୟାରକୁ ବ୍ଲକ୍ କରିବାକୁ ଅନେକ କିଛି କରେ @@ -296,5 +297,6 @@ Chromium ଆପଣଙ୍କ ସେଟିଂସ୍‌କୁ ପୁନରୁଦ୍ Chromium OS ସିଷ୍ଟମ୍ Chromium ହୁଏତ ସଠିକ୍ ଭାବେ କାର୍ଯ୍ୟ କରି ନପାରେ କାରଣ ଏହା ଆଉ Windows XP କିମ୍ବା Windows Vistaରେ ସମର୍ଥିତ ନୁହେଁ କିଏ Chromium ବ୍ୟବହାର କରୁଛନ୍ତି? +Chromiumର ସବୁଠାରୁ ଶକ୍ତିଶାଳୀ ସୁରକ୍ଷା ପାଆନ୍ତୁ Chromium ଲେଖକ \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 6245d216a148d5..bdd78d6475716a 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb @@ -111,6 +111,7 @@ Chromium ਬਾਰੇ ਮਦਦ ਪ੍ਰਾਪਤ ਕਰੋ ਅਚਨਚੇਤ ਗੜਬੜ ਕਾਰਨ ਸਥਾਪਨਾ ਅਸਫਲ ਹੋ ਗਈ। ਜੇਕਰ ਇਸ ਵੇਲੇ Chromium ਚੱਲ ਰਿਹਾ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਬੰਦ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। ਕੀ ਫਿਰ ਵੀ Chromium ਤੋਂ ਬਾਹਰ ਜਾਣਾ ਹੈ? +ਉਨ੍ਹਾਂ ਪਰਦੇਦਾਰੀ ਵਿਕਲਪਾਂ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ ਜਿਨ੍ਹਾਂ ਨੂੰ Chromium ਸਭ ਤੋਂ ਮਹੱਤਵਪੂਰਨ ਸਮਝਦਾ ਹੈ। ਇਸ ਗਾਈਡ ਵਿੱਚ ਹਰ ਸੈਟਿੰਗ ਅਤੇ ਵਿਕਲਪ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ। Chromium ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਣ ਦਿਓ Google Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਕੇ ਕੰਟਰੋਲ ਕਰੋ। ਧੋਖਾਧੜੀ ਅਤੇ ਮਾਲਵੇਅਰ ਨੂੰ ਬਲਾਕ ਕਰਨ ਵਾਸਤੇ ਵਿਸਤ੍ਰਿਤ ਸੁਰੱਖਿਆ ਹੋਰ ਵੱਧ ਕੰਮ ਕਰਦੀ ਹੈ @@ -298,5 +299,6 @@ Chromium ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਮੁੜ-ਹਾਸ Chromium OS ਸਿਸਟਮ ਸ਼ਾਇਦ Chromium ਠੀਕ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ ਕਿਉਂਕਿ ਇਹ ਹੁਣ Windows XP ਜਾਂ Windows Vista 'ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਦਾ ਹੈ Chromium ਕੌਣ ਵਰਤ ਰਿਹਾ ਹੈ? +Chromium ਦੀ ਸਭ ਤੋਂ ਮਜਬੂਤ ਸੁਰੱਖਿਆ ਪ੍ਰਾਪਤ ਕਰੋ The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index 55fc69c3adc7b5..02f01e6fd2eed3 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb @@ -107,6 +107,7 @@ Pomoc do Chromium Instalacja nie powiodła się z powodu nieokreślonego błędu. Jeśli Chromium jest aktualnie uruchomiony, zamknij go i spróbuj ponownie. Zamknąć Chromium mimo to? +Dostosuj opcje prywatności, które Chromium uważa za najważniejsze. Ten przewodnik nie uwzględnia wszystkich ustawień ani opcji. Zezwalaj Chromium na działanie w tle Dostosowywanie i kontrolowanie Chromium Silniejsza ochrona lepiej chroni przed phishingiem i złośliwym oprogramowaniem @@ -233,6 +234,7 @@ Chromium nie może odzyskać ustawień. System operacyjny Chromium – informacje Wyczyść też dane z Chromium () Jeśli ustawienia nie widać na tej stronie, zajrzyj do ustawień systemu operacyjnego Chromium +Na swoim koncie włączyłeś(-aś) Ulepszone Bezpieczne przeglądanie. Zacznij korzystać z tej funkcji w Chromium. Chromium używa Twojej kamery i mikrofonu. Przeglądarka Chromium jest jeszcze lepsza Chromium nie jest domyślną przeglądarką @@ -292,5 +294,6 @@ Chromium nie może odzyskać ustawień. System operacyjny Chromium Chromium może działać nieprawidłowo, bo nie jest już zgodny z Windows XP ani Windows Vista Kto używa Chromium? +Korzystaj z najlepszych zabezpieczeń Chromium Autorzy Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 1367e34ab1e9cc..1a15e36fb73ebb 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb @@ -231,6 +231,7 @@ Sobre o Chromium OS Limpar também os dados do Chromium () Se uma configuração não for exibida nesta página, verifique as configurações do Chromium OS +Você ativou o Navegação segura com maior proteção na sua conta. Agora, ative-o no Chromium. O Chromium está usando sua câmera e seu microfone. O Chromium ficou ainda melhor O Chromium não é seu navegador padrão diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 9a654523814622..ae129f7b4f175f 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb @@ -107,6 +107,7 @@ Справка Chromium Установка не удалась из-за неизвестной ошибки. Если Chromium продолжает работать, закройте его и повторите попытку. Закрыть Chromium? +Настройте самые важные параметры конфиденциальности Chromium. В этом руководстве указаны не все настройки. Разрешить Chromium работать в фоновом режиме Настройка и управление Chromium В режиме "Улучшенная защита" фишинговые атаки и вредоносное ПО блокируются ещё эффективнее. @@ -290,5 +291,6 @@ Chromium OS В работе Chromium могут возникать сбои, так как браузер больше не поддерживает Windows XP и Windows Vista. Кто использует Chromium? +Обеспечьте максимальную защиту в Chromium Авторы Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 2b9aacda77cdbf..2651f0fe0fab88 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb @@ -111,6 +111,7 @@ Nekatere funkcije morda niso na voljo in spremembe nastavitev ne bodo shranjene. Pomoč za Chromium Namestitev ni bila izvedena zaradi nedoločene napake. Če se Chromium trenutno izvaja, ga zaprite in poskusite znova. Želite vseeno zapreti Chromium? +Prilagodite izbire glede zasebnosti, ki jih Chromium obravnava kot najpomembnejše. V tem vodniku niso vse nastavitve in možnosti. Naj se Chromium izvaja v ozadju Prilagajanje in nadziranje Chromiuma Izboljšana zaščita učinkoviteje blokira lažno predstavljanje in zlonamerno programsko opremo. @@ -298,5 +299,6 @@ Chromium ne more obnoviti vaših nastavitev. Sistem Chromium OS Chromium morda ne bo deloval pravilno, ker ni več podprt v sistemu Windows XP ali Windows Vista Kdo uporablja Chromium? +Prejmite Chromiumovo najmočnejšo varnost Ustvarjalci Chromiuma \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index 92f22274fa610b..2fb766a083b8dc 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb @@ -111,6 +111,7 @@ Disa funksione mund të mos ofrohen dhe ndryshimet në preferenca nuk do të ruh Merr ndihmë me Chromium Instalimi dështoi për shkak të një gabimi të paspecifikuar. Nëse Chromium është aktualisht në ekzekutim, mbylle dhe provo përsëri. Dëshiron të dalësh nga Chromium gjithsesi? +Personalizo zgjedhjet e privatësisë që Chromium konsideron si më të rëndësishmet. Ky udhëzues nuk përfshin çdo cilësim dhe opsion. Lejo që Chromium të ekzekutohet në sfond Personalizo dhe kontrollo Chromium Mbrojtja e përmirësuar bën edhe më shumë për bllokimin e mashtrimeve dhe softuerëve keqdashës @@ -297,5 +298,6 @@ Chromium nuk është në gjendje të rikuperojë cilësimet e tua. Sistemi Chromium OS Chromium mund të mos funksionojë si duhet sepse nuk mbështetet më në Windows XP ose Windows Vista Kush po e përdor Chromium? +Merr sigurinë më të fortë të Chromium Autorët e Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb index d56d2fec4ddad9..d2a7613deefbe7 100644 --- a/chrome/app/resources/chromium_strings_sr-Latn.xtb +++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb @@ -240,6 +240,7 @@ Chromium ne može da vrati podešavanja. Obriši podatke i iz Chromium-a () Ako se podešavanje ne prikazuje na ovoj stranici, potražite ga u podešavanjima Chromium OS-a +Uključili ste poboljšano bezbedno pregledanje na nalogu. Uključite ga i za Chromium. Chromium koristi kameru i mikrofon. Upravo smo poboljšali Chromium Chromium nije podrazumevani pregledač diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index 8ce0f76ff422f6..e4d4fae0214b41 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb @@ -240,6 +240,7 @@ Chromium не може да врати подешавања. Обриши податке и из Chromium-а () Ако се подешавање не приказује на овој страници, потражите га у подешавањима Chromium ОС-а +Укључили сте побољшано безбедно прегледање на налогу. Укључите га и за Chromium. Chromium користи камеру и микрофон. Управо смо побољшали Chromium Chromium није подразумевани прегледач diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index aec159d5e33dee..e323a2dbb042ce 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb @@ -239,6 +239,7 @@ Chromium kan inte återställa dina inställningar. Rensa även data från Chromium () Om en inställning saknas på den här sidan tittar du i inställningarna för Chromium OS +Du har aktiverat Förbättrad säker webbsökning i kontot. Skaffa funktionen även för Chromium. Chromium använder din kamera och mikrofon. Vi har förbättrat Chromium Chromium är inte din standardwebbläsare diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index 2dc9b445513aba..41bb6233765471 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb @@ -109,6 +109,7 @@ Chromium தொடர்பான உதவி பெறுக குறிப்பிடப்படாத பிழைக் காரணமாக நிறுவல் தோல்வியடைந்தது. Chromium தற்போது இயக்கத்தில் இருந்தால், அதை மூடி, பின்னர் முயலவும். Chromium இலிருந்து வெளியேறவா? +Chromiumமிற்கு மிக முக்கியமாக இருக்கும் தனியுரிமை விருப்பங்களைப் பிரத்தியேகமாக்கலாம். சில அமைப்புகளும் விருப்பங்களும் மட்டுமே இந்த வழிகாட்டியில் இருக்கும். பின்னணியில் Chromiumஐ இயங்க அனுமதி Chromium ஐ தனிப்பயனாக்கி கட்டுப்படுத்துக ஃபிஷிங்கையும் மால்வேரையும் தடுக்க மேம்பட்ட பாதுகாப்பு உதவுகிறது @@ -296,5 +297,6 @@ Chromium OS சிஸ்டம் Windows XP அல்லது Windows Vista ஆகியவற்றில் Chromium இனி ஆதரிக்கப்படாது என்பதால், அது சரியாகச் செயல்படாது Chromiumமைப் பயன்படுத்துவது யார்? +Chromiumமின் உச்சபட்சப் பாதுகாப்பைப் பெறுங்கள் Chromium அங்கீகரிப்பாளர்கள் \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index dbd54464326ba4..a7d87bf563adb6 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb @@ -234,6 +234,7 @@ అలాగే ()లో ఉన్న Chromiumకి సంబంధించిన డేటాని తీసివేయి ఏదైనా సెట్టింగ్ ఈ పేజీలో కనపడకపోతే, మీ Chromium OS సెట్టింగ్‌లులో చూడండి +మీరు మీ ఖాతాలో మెరుగైన సురక్షిత బ్రౌజింగ్‌ను ఆన్ చేశారు. ఇప్పుడు దాన్ని Chromiumలో పొందండి. Chromium మీ కెమెరా మరియు మైక్రోఫోన్‌ని ఉపయోగిస్తోంది. Chromium ఇప్పుడు మెరుగైంది Chromium మీ డిఫాల్ట్ బ్రౌజర్ కాదు diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index e24ef34020fc51..78b4d419181be3 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb @@ -109,6 +109,7 @@ Отримати довідку щодо Chromium Не вдалося встановити через невизначену помилку. Якщо Chromium зараз запущено, закрийте його та повторіть спробу. Усе одно вийти з Chromium? +Персоналізуйте параметри конфіденційності, які Chromium вважає найважливішими. Цей посібник містить не всі налаштування й параметри. Дозволити Chromium працювати у фоновому режимі Налаштування та керування Chromium Покращений захист ще ефективніше блокує фішинг і зловмисне програмне забезпечення @@ -296,5 +297,6 @@ Chromium не може відновити ваші налаштування.ОС Chromium Chromium може працювати неналежним чином, оскільки більше не підтримується у Windows XP та Windows Vista Хто користується веб-переглядачем Chromium? +Отримайте найвищий рівень безпеки в Chromium The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index 3dbd9d07696f38..b0b2ec485fa964 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb @@ -109,6 +109,7 @@ Nhận trợ giúp về Chromium Không thể cài đặt do lỗi chưa xác định. Nếu Chromium hiện đang chạy, hãy đóng Chromium và thử lại. Bạn vẫn muốn thoát khỏi Chromium? +Tuỳ chỉnh những lựa chọn bảo mật mà Chromium coi là quan trọng nhất. Hướng dẫn này không bao gồm mọi chế độ cài đặt và tuỳ chọn. Cho phép Chromium chạy trong nền Tùy chỉnh và điều khiển Chromium Chế độ bảo vệ tăng cường giúp chặn phần mềm độc hại và hành vi lừa đảo hiệu quả hơn @@ -296,5 +297,6 @@ Chromium không thể khôi phục cài đặt của bạn. Hệ thống Chromium OS Chromium có thể không hoạt động chính xác do không được hỗ trợ trên Windows XP hoặc Windows Vista nữa Ai đang sử dụng Chromium? +Có được chế độ bảo mật mạnh nhất của Chromium Tác giả Chromium \ No newline at end of file diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index e3f2728f1f6149..2826ba7477cd37 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb @@ -111,7 +111,7 @@ 取得 Chromium 相關說明 不明錯誤導致安裝失敗。如果目前 Chromium 正在執行,請關閉 Chromium,然後再試一次。 仍要結束 Chromium 嗎? -自訂 Chromium 最重視的隱私權選項。這份指南並未涵蓋所有設定和選項。 +自訂 Chromium 最重視的的私隱選項。此指南並未涵蓋所有設定和選項。 讓 Chromium 在背景執行 自訂及控制 Chromium 強化保護功能可進一步封鎖仿冒詐騙和惡意軟件 @@ -297,6 +297,6 @@ Chromium 無法復原您的設定。 Chromium 作業系統 由於 Chromium 將不再支援 Windows XP 或 Windows Vista,因此可能無法正常運作 誰在使用 Chromium? -獲得 Chromium 最強大的安全防護 +取得 Chromium 最強大的安全防護功能 The Chromium Authors \ No newline at end of file diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 51d93817c541f2..58bd16b4b149e7 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb @@ -2518,6 +2518,7 @@ en Ctrl+Alt+Verlaag Helderheid om uit te zoem Stel webwerfbeperkings en skermtydlimiete met Family Link Kon nie beleid op die toestel installeer nie. Ongeveer oor +Ontvang vibrasiebevestiging vir handelinge soos verdeelde skerm en lessenaaromskakeling. &Speltoets Hierdie proses kan 'n paar minute neem. Stel tans die Linux-houer op. Bekyk onlangse Chrome-oortjies van jou foon af @@ -4919,6 +4920,7 @@ Maak seker jy wys nie enige sensitiewe inligting nie. Kyk op jou foon Stel jou versteksoekenjin vir Chrome-blaaier en -lanseerder Skakel na die primêre gebruikerprofiel op jou foon toe oor om Smart Lock te gebruik +Hierdie loglêers is in My Lêers gestoor as Verander taal- en invoerinstellings Gee toestel die naam Speld hierdie bladsy aan beginskerm vas … @@ -5695,6 +5697,7 @@ Maak seker jy wys nie enige sensitiewe inligting nie. Eksterne sekuriteitsleutel of ingeboude sensor {NUM_EXTENSIONS,plural, =1{'n Uitbreiding is afgekeur}other{# uitbreidings is afgekeur}} Opgradering voltooi +Kliksensitiwiteit 'n Papierlaai ontbreek Skryftaak oorskry die maksimum lengte van die kenmerk by: "". Jy het 1 gestoorde drukker. @@ -6824,6 +6827,7 @@ Hou jou sleutellêer op 'n veilige plek. Jy gaan dit nodig hê om nuwe weergawes Groep Verbindingdialoog Google Wolkdruk +Fisiese terugvoer Druk as prent Programdata kan enige data wees wat 'n program gestoor het (op grond van ontwikkelaarinstellings), insluitend data soos kontakte, boodskappe en foto's. Rugsteundata sal nie deel vorm van jou kind se Drive-berging nie. diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index d5c9e6dbb2ffaa..16e75b3b7a3c65 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb @@ -412,6 +412,7 @@ • Kukilər və digər müvəqqəti sayt datası silinəcək Əlfəcinlər, tarixçə və yadda saxlanılmış parollara heç bir təsir göstərilməyəcək. +Giriş kodu tanınmadı Bəli bloklanıb Yenidən Cəhd Edin düyməsinə klikləyin və kompüterdə bildiriş əldə edin @@ -576,6 +577,7 @@ Ödəniş üsulunu yadda saxlayın Linux güncəllənir Əlçatan +Bluetooth deaktivdir. Əlçatan cihazları görmək üçün Bluetooth'u aktiv edin. Güncəlləmələr administratorunuz tərəfindən deaktiv edildi. Səhifə debaqlayıcı bazasına daxil olun Tətbiq edin @@ -1128,6 +1130,7 @@ Cihazda Family Link tətbiqini quraşdırmaqla bu hesabın ayarlarını idarə e Yayım paneli Əlfəcinə düzəliş edin Axtarış istiqamətləri +Bu displeydə yayımlamaq icazəniz yoxdur "" əlavə edilsin? Yanlış panel indeksi daxil edildi. Prolfinizə printerlər əlavə edin @@ -2595,6 +2598,7 @@ Cihazda Family Link tətbiqini quraşdırmaqla bu hesabın ayarlarını idarə e Əlçatımlılıq ayarlarını oxuyun {NUM_FILES,plural, =1{Bir fayla daimi girişi var.}other{# fayla daimi girişi var.}} TrackPoint sürətlənməsi +Giriş kodunu dəfələrlə yanlış daxil etmisiniz. Sonra cəhd edin Güvənilməyən Arıtırma İkonası Chrome ayarlarınızdan bəzilərinin digər proqram tərəfindən xarab edildiyini aşkarladı və onları defolt vəziyyətinə sıfırladı. @@ -2678,6 +2682,7 @@ Cihazda Family Link tətbiqini quraşdırmaqla bu hesabın ayarlarını idarə e ilə birləşdirmək üçün PIN daxil edin Tətbiqləri silmək üçün Ayarlar > Google Play Market > Android tərcihlərini idarə edin > Tətbiqlər və ya Tətbiq meneceri bölməsinə daxil olun. Sonra quraşdırılmasını ləğv etmək istədiyiniz tətbiqə klikləyin (tətbiqi tapmaq üçün sağa və ya sola sürüşdürməlisiniz). Quraşdırılmanı Ləğv Edin və ya Deaktiv Edin seçiminə klikləyin. Yazarkən görünən sətir içi yazı təkliflərini göstərin +Qabaqcıl güvənlik aktiv edilsin? Baqı şikayət edin Chrome parolunuzu bu cihazda saxlayıb, lakin siz onu Google Hesabınızda saxlaya bilərsiniz. Sonra, Google Hesabınızdakı bütün parollar da daxil olduğunuz halda əlçatan olacaq. Övladınız barmaq izini yadda saxlamaq üçün barmağını qaldırmağa davam etməlidir @@ -3191,6 +3196,7 @@ Cihazda Family Link tətbiqini quraşdırmaqla bu hesabın ayarlarını idarə e Bu cihazda maksimum eSIM profili quraşdıra bilərsiniz. Başqa bir profil əlavə etmək üçün əvvəlcə mövcud profili silin. Xidmət Şərtləri Ağıllı Kilid aktiv edildi +Qabaqcıl güvənlik deaktiv edilsin? Parolu Yeniləyin Çıxarın Bu faylı skan edərkən antivirus dayandı. @@ -4664,6 +4670,7 @@ Bu əməliyyata birdən çox keçirici təyin edə bilərsiniz. tezliklə dayanacaq məhsulunu onun disk obrazindan işlədirsiniz. Onun kompüterə quraşdırılması disk obrazı olmadan işlətməyinizə imkan verəcək və həmişə güncəl qalmasını sağlayacaq. İstifadə statistikası və qəza raportlarını avtomatik Google'a göndərir +Şəbəkə kommunikasiya problemləri Veb ünvanı axtarın və yazın Ok, Anladım Saxlanılmış parollar @@ -5956,6 +5963,7 @@ Bu əməliyyata birdən çox keçirici təyin edə bilərsiniz. Linux'u güncəlləyərkən xəta baş verdi. Yedəyinizdən istifadə edərək konteyneri bərpa edəcəyik. x (Ən yaxşı) Güvənlik açarını yenidən daxil edib cəhd edin +Bu ayarı ünvan panelində dəyişdirin. Paylaşım etdiyiniz cihaz cavab vermədi. Yenidən cəhd edin. Üzr istəyirik, administratorunuz hesabınızda xarici yaddaş ehtiyatını deaktiv edib. Defolt divar kağızı @@ -7707,6 +7715,7 @@ Bu saytın blok edilməsini düşünmürəm! endirmə Bir az səbr edin; virtual maşın endirilir. Linki yeni paneldə açın +Hesabınızda Qabaqcıl Güvənli Baxışı deaktiv etdiniz. Təşkilatınız Google Play Mağazanı hesabınız üçün aktiv etməyib. Əlavə məlumat üçün administratorla əlaqə saxlayın. Sürətli Gmail diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 24fba3547b0b75..9d49c75a00dad5 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb @@ -2505,6 +2505,7 @@ Наладжвайце доступ да вэб-сайтаў і абмяжоўвайце час карыстання прыладай праз Family Link Не ўдалося ўсталяваць палітыку на прыладу. Засталося: +Пацвярджаць дзеянні вібрацыяй (напрыклад, падзел экрана або пераключэнне паміж працоўнымі сталамі). &Праверка правапісу Гэты працэс можа заняць некалькі хвілін. Ідзе наладжванне кантэйнера Linux. Праглядайце нядаўна адкрытыя ўкладкі Chrome з тэлефона @@ -4902,6 +4903,7 @@ Праверце свой тэлефон Задайце стандартную пошукавую сістэму для браўзера Chrome і Панэлі запуску на прыладзе Каб выкарыстоўваць Smart Lock, пераключыцеся на асноўны карыстальніцкі профіль на тэлефоне +Гэтыя журналы захаваны ў раздзеле "Мае файлы" пад назвай Змяніць налады мовы і ўводу Даць прыладзе назву "" Замацаваць гэту старонку на пачатковым экране... @@ -5678,6 +5680,7 @@ Знешні ключ бяспекі або ўбудаваны датчык {NUM_EXTENSIONS,plural, =1{Пашырэнне адхілена}one{# пашырэнне адхілена}few{# пашырэнні адхілена}many{# пашырэнняў адхілена}other{# пашырэння адхілена}} Абнаўленне завершана +Сіла націскання Адсутнічае латок для паперы Аперацыя запісу перавышае максімальную даўжыню атрыбута для прылады: "". У вас адзін захаваны прынтар. @@ -6806,6 +6809,7 @@ Група "" –  – Дыялогавае акно падключэння Google Cloud Print +Тактыльны водгук Друкаваць як відарыс Даныя праграм – гэта любыя даныя, якія захоўваюцца праграмай (у залежнасці ад налад распрацоўшчыка), у тым ліку кантакты, паведамленні і фота. Даныя рэзервовай копіі не будуць улічвацца ў квоце сховішча вашага дзіцяці на Дыску. diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 3fc0f5cd320cd7..0151d936fa6306 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb @@ -418,6 +418,7 @@ Domena zahtijeva da pametna kartica ostane umetnuta.}} Ova radnja neće uticati na oznake, historiju i sačuvane lozinke. +Pristupna šifra nije prepoznata Da Aplikacija je blokirana Kliknite Pokušaj ponovo i prihvatite upit na računaru @@ -585,6 +586,7 @@ da li proksi server funkcionira. Ako smatrate da ne trebate koristiti Sačuvaj način plaćanja Nadograđivanje Linuxa Dostupno +Bluetooth je isključen. Da biste vidjeli dostupne uređaje, uključite Bluetooth. Administrator je onemogućio ažuriranja. Pristup pozadini programa za otklanjanje grešaka na stranici Primijeni @@ -1143,6 +1145,7 @@ Postavkama ovog računa možete upravljati instaliranjem aplikacije Family Link Emitiraj karticu Uredi oznaku Odredišta za pretraživanje +Nemate dopuštenje za emitiranje na tom zaslonu Dodati ekstenziju ""? Unesen je nevažeći indeks za karticu. Dodajte štampače na svoj profil @@ -2610,6 +2613,7 @@ Domena zahtijeva da pametna kartica ostane umetnuta.Čitanje vaših postavki pristupačnosti {NUM_FILES,plural, =1{Ima trajan pristup jednom fajlu.}one{Ima trajan pristup # fajlu.}few{Ima trajan pristup za # fajla}other{Ima trajan pristup za # fajlova}} Ubrzanje TrackPointa +Unijeli ste netočnu pristupnu šifru previše puta. Pokušajte ponovo kasnije Nepouzdan Ikona ekstenzije Chrome je otkrio da je drugi program oštetio neke vaše postavke i vratio ih na zadano. @@ -2693,6 +2697,7 @@ Domena zahtijeva da pametna kartica ostane umetnuta.Unesite PIN da se uparite s uređajem Za uklanjanje aplikacija idite na Postavke > Trgovina Play > Upravljanje postavkama Androida > Aplikacije ili Upravitelj aplikacija. Zatim dodirnite aplikaciju koju želite deinstalirati (možda ćete morati prijeći prstom udesno ili ulijevo kako biste pronašli aplikaciju). Zatim dodirnite Deinstaliraj ili Onemogući. Prikaz prijedloga za pisanje u ravni koji se prikazuju dok pišete +Uključiti poboljšanu sigurnost? Prijava programske pogreške Chrome je sačuvao vašu lozinku na ovaj uređaj, ali je umjesto toga možete sačuvati na svoj Google račun. Nakon toga će sve lozinke na vašem Google računu također biti dostupne dok ste prijavljeni. Vaše dijete treba nastaviti podizati prst da sačuva otisak prsta @@ -3208,6 +3213,7 @@ Domena zahtijeva da pametna kartica ostane umetnuta.Možete instalirati najviše eSIM profil/a na ovom uređaju. Da dodate drugi profil, najprije uklonite postojeći profil. Uslovi korištenja usluge Pametno zaključavanje je uključeno +Isključiti poboljšanu sigurnost? Ažuriraj lozinku Otkači Antivirusni softver je neočekivano prestao raditi prilikom skeniranja ovog fajla. @@ -4682,6 +4688,7 @@ Ovoj radnji možete dodijeliti više prekidača. Aplikacija će se uskoro pauzirati Pokrećete sa slike diska. Ako ga instalirate na računaru, moći ćete ga pokrenuti bez slike diska i uvijek će biti ažuriran. Automatski šalje Googleu statistiku korištenja i izvještaje o padovima aplikacije +Poteškoće s mrežnom komunikacijom Pretražite ili unesite web adresu Uredu, razumijem Sačuvane lozinke @@ -5976,6 +5983,7 @@ Domena zahtijeva da pametna kartica ostane umetnuta.Došlo je do greške prilikom nadogradnje Linuxa. Spremnik ćemo vratiti pomoću vaše sigurnosne kopije. x (najbolje) Ponovo umetnite sigurnosni ključ i pokušajte ponovo +Promijenite tu postavku u adresnoj traci. Uređaj s kojim dijelite sadržaj ne odgovara. Pokušajte ponovo. Vaš administrator je onemogućio vanjsku pohranu na vašem računu. Zadana pozadinska slika @@ -7733,6 +7741,7 @@ Domena zahtijeva da pametna kartica ostane umetnuta.}}preuzimanje Ovo može potrajati nekoliko minuta. Preuzima se virtualni računar. Otvori link u novoj kar&tici +Isključili ste poboljšano sigurno pregledavanje na svom računu. Vaša organizacija nije omogućila Trgovinu Google Play za vaš račun. Više informacija zatražite od administratora. Brže Gmail diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 323f2ce4f68f66..6b471be032c4a7 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb @@ -2504,6 +2504,7 @@ Zpráva serveru: Nastavte pomocí služby Family Link omezení přístupu na webové stránky a limity času stráveného na zařízení Instalace zásady do zařízení se nezdařila. Zbývá asi +Potvrzovat akce jako rozdělení obrazovky nebo přepnutí plochy vibrací. &Kontrola pravopisu Tento proces může trvat několik minut. Probíhá nastavování kontejneru systému Linux. Zobrazovat karty Chromu nedávno použité v telefonu @@ -4902,6 +4903,7 @@ K této akci lze přiřadit několik přepínačů. Zkontrolujte telefon Nastavte výchozí vyhledávač pro prohlížeč Chrome a pro Spouštěč zařízení Chcete-li použít funkci Smart Lock, přejděte na primární uživatelský profil na telefonu +Tyto protokoly byly uloženy do sekce Moje soubory jako Změnit nastavení jazyka a vstupu Nastavit název zařízení na Připnout tuto stránku na úvodní obrazovku... @@ -5678,6 +5680,7 @@ K této akci lze přiřadit několik přepínačů. Externí bezpečnostní klíč nebo zabudovaný senzor {NUM_EXTENSIONS,plural, =1{Rozšíření bylo zamítnuto}few{# rozšíření byla zamítnuta}many{# rozšíření bylo zamítnuto}other{# rozšíření bylo zamítnuto}} Upgrade dokončen +Síla kliknutí Chybí zásobník papíru Operace zápisu překračuje maximální délku atributu povolenou pro zařízení . Máte 1 uloženou tiskárnu. @@ -6807,6 +6810,7 @@ Svůj soubor klíče uchovávejte na bezpečném místě. Budete jej potřebovat Skupina Dialogové okno připojení Google Cloud Print +Hmatová odezva Vytisknout jako obrázek Data aplikací mohou zahrnovat jakákoliv data, která uložila aplikace (v závislosti na nastavení vývojáře), včetně dat, jako jsou kontakty, zprávy a fotky. Zálohovaná data se nezapočítávají do kvóty úložiště na Disku dítěte. diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 2f9f9e25bdcc7e..cd0dd88826ea5a 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb @@ -2519,6 +2519,7 @@ og tryk på Ctrl+Alt+lysstyrke ned for at zoome ud. Angiv websitebegrænsninger og grænser for skærmtid ved hjælp af Family Link Politikken kunne ikke installeres på enheden. Ca. tilbage +Få vibrationsfeedback ved handlinger, f.eks. opdeling af skærm og skift mellem skriveborde. &Stavekontrol Denne proces kan tage et par minutter. Linux-containeren konfigureres. Se de seneste Chrome-faner fra din telefon @@ -4919,6 +4920,7 @@ Flere kontakter kan tildeles denne handling. Tjek din telefon Angiv din standardsøgemaskine for Chrome-browseren og applisten på din Skift til den primære brugerprofil på din telefon for at bruge Smart Lock +Disse logs er blevet gemt i Mine filer som Rediger indstillingerne for sprog og indtastning Navngiv enheden: Fastgør denne side til startskærmen... @@ -5695,6 +5697,7 @@ Flere kontakter kan tildeles denne handling. Ekstern sikkerhedsnøgle eller indbygget sensor {NUM_EXTENSIONS,plural, =1{En udvidelse blev afvist}one{# udvidelse blev afvist}other{# udvidelse blev afvist}} Opgraderingen er fuldført +Klikstyrke Der mangler en papirbakke Skrivehandlingen overskrider den maksimale længde af attributten på: "". Du har 1 gemt printer. @@ -6824,6 +6827,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye Gruppe Dialogboks for forbindelse Google Cloudprinter +Feedback ved berøring Udskriv i billedformat Appdata kan være alle former for data, som en app har gemt (baseret på udviklerens indstillinger), f.eks. kontakter, beskeder og billeder. Sikkerhedskopierede data tæller ikke med i din kvote for Drev-lagerplads. diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index d5267691fcb187..c4663011ad9b97 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb @@ -2500,6 +2500,7 @@ Servernachricht: Mit Family Link den Web-Zugriff und die Gerätenutzungsdauer begrenzen Fehler beim Installieren der Richtlinie auf dem Gerät. Noch +Wenn diese Option aktiviert ist, vibriert das Gerät, wenn Sie beispielsweise zwischen Desktops wechseln oder den geteilten Bildschirmmodus aktivieren. &Rechtschreibprüfung Der Vorgang kann einige Minuten dauern. Linux-Container wird eingerichtet. Zuletzt geöffnete Chrome-Tabs von Ihrem Smartphone sehen @@ -4897,6 +4898,7 @@ Sie können dieser Aktion mehrere Schalter zuweisen. Smartphone prüfen Hier können Sie die Standardsuchmaschine für den Chrome-Browser und Launcher festlegen Wenn Sie Smart Lock verwenden möchten, wechseln Sie zum Profil des Hauptnutzers Ihres Smartphones +Diese Protokolle wurden unter „Meine Dateien“ gespeichert als Sprach- und Eingabeeinstellungen ändern Gerät als „“ benennen Diese Seite an Startbildschirm anpinnen... @@ -5673,6 +5675,7 @@ Sie können dieser Aktion mehrere Schalter zuweisen. Externer Sicherheitsschlüssel oder integrierter Sensor {NUM_EXTENSIONS,plural, =1{Eine Erweiterung wurde abgelehnt}other{# Erweiterungen wurden abgelehnt}} Upgrade abgeschlossen +Klickempfindlichkeit Papierfach fehlt Der Schreibvorgang auf das folgende Gerät überschreitet die maximal zulässige Attributlänge: "". Sie haben 1 gespeicherten Drucker. @@ -6802,6 +6805,7 @@ Speichern Sie Ihre Schlüsseldatei an einem sicheren Ort. Sie benötigen die Dat Gruppe  –  – Dialogfeld für die Verbindung Google Cloud Print +Haptisches Feedback Als Bild drucken App-Daten können alle Daten sein, die von einer App basierend auf den Entwicklereinstellungen gespeichert wurden, einschließlich Daten wie Kontakte, Nachrichten und Fotos. Die Sicherungsdaten werden nicht auf das Google Drive-Speicherkontingent Ihres Kindes angerechnet. diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index a779296d39787b..82eadc95983aba 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb @@ -416,6 +416,7 @@ • Θα διαγράψει τα cookie και τα άλλα προσωρινά δεδομένα ιστοτόπων. Οι σελιδοδείκτες, το ιστορικό και οι αποθηκευμένοι κωδικοί πρόσβασης δεν θα επηρεαστούν. +Ο κωδικός πρόσβασης δεν αναγνωρίζεται. Ναι Η εφαρμογή αποκλείστηκε Κάντε κλικ στην επιλογή "Δοκιμάστε ξανά" και αποδεχτείτε την προτροπή στον υπολογιστή σας @@ -583,6 +584,7 @@ Αποθήκευση τρόπου πληρωμής Γίνεται αναβάθμιση του Linux Διατίθεται +Το Bluetooth είναι απενεργοποιημένο. Για να δείτε τις διαθέσιμες συσκευές, ενεργοποιήστε το Bluetooth. Οι ενημερώσεις έχουν απενεργοποιηθεί από τον διαχειριστή σας. Πρόσβαση στο σύστημα υποστήριξης εντοπισμού σφαλμάτων σελίδων Εφαρμογή @@ -1144,6 +1146,7 @@ Μετάδοση καρτέλας Επεξεργασία σελιδοδείκτη Αναζήτηση προορισμών +Δεν έχετε δικαίωμα μετάδοσης σε αυτήν την οθόνη. Να γίνει προσθήκη του ""; Καταχωρήθηκε μη έγκυρος κατάλογος καρτελών. Προσθέστε εκτυπωτές στο προφίλ σας @@ -2612,6 +2615,7 @@ Ανάγνωση των ρυθμίσεων προσβασιμότητας {NUM_FILES,plural, =1{Έχει μόνιμη πρόσβαση σε ένα αρχείο.}other{Έχει μόνιμη πρόσβαση σε # αρχεία.}} Επιτάχυνση TrackPoint +Έχετε εισαγάγει εσφαλμένο κωδικό πρόσβασης πάρα πολλές φορές. Δοκιμάστε ξανά αργότερα. Μη αξιόπιστα Εικονίδιο επέκτασης Το Chrome διαπιστώσαμε ότι ορισμένες από τις ρυθμίσεις σας καταστράφηκαν από άλλο πρόγραμμα και τις επανέφερε στις αρχικές τους προεπιλογές. @@ -2695,6 +2699,7 @@ Εισαγάγετε το PIN για σύζευξη με τη συσκευή . Για να καταργήσετε εφαρμογές, μεταβείτε στις Ρυθμίσεις > Google Play Store > Διαχείριση προτιμήσεων Android > Εφαρμογές ή Διαχείριση εφαρμογών. Έπειτα, πατήστε την εφαρμογή που θέλετε να απεγκαταστήσετε (μπορεί να χρειαστεί να σύρετε προς τα δεξιά ή προς τα αριστερά για να βρείτε την εφαρμογή). Στη συνέχεια, πατήστε Απεγκατάσταση ή Απενεργοποίηση. Εμφάνιση ενσωματωμένων προτάσεων γραφής που εμφανίζονται ενώ πληκτρολογείτε +Ενεργοποίηση της βελτιωμένης ασφάλειας; Αναφορά σφάλματος Το Chrome αποθήκευσε τον κωδικό πρόσβασής σας σε αυτήν τη συσκευή, αλλά μπορείτε να τον αποθηκεύσετε στον Λογαριασμό σας Google. Στη συνέχεια, όλοι οι κωδικοί πρόσβασης στον Λογαριασμό σας Google θα είναι επίσης διαθέσιμοι ενώ είστε συνδεδεμένοι. Ζητήστε από το παιδί σας να συνεχίσει να σηκώνει το δάκτυλό του για να αποθηκευτεί το δακτυλικό αποτύπωμα. @@ -3210,6 +3215,7 @@ Μπορείτε να εγκαταστήσετε έως και προφίλ eSIM σε αυτήν τη συσκευή. Για να προσθέσετε ένα νέο προφίλ, καταργήστε πρώτα ένα υπάρχον. Όροι Παροχής Υπηρεσιών Το Smart Lock είναι ενεργοποιημένο +Απενεργοποίηση βελτιωμένης ασφάλειας; Ενημέρωση κωδικού πρόσβασης Ξεκαρφίτσωμα Η λειτουργία του λογισμικού προστασίας από ιούς απέτυχε μη αναμενόμενα κατά τη σάρωση αυτού του αρχείου. @@ -4685,6 +4691,7 @@ Η εφαρμογή θα τεθεί σύντομα σε παύση. Εκτελείτε το από την εικόνα δίσκου. Αν το εγκαταστήσετε στον υπολογιστή σας, θα μπορείτε να το εκτελείτε χωρίς την εικόνα δίσκου και θα παραμένει ενημερωμένο. Αποστέλλει αυτόματα στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων στην Google +Προβλήματα επικοινωνίας δικτύου Αναζητήστε ή πληκτρ. μια διεύθ. ιστού OK, το κατάλαβα! Αποθηκευμένοι κωδικοί πρόσβασης @@ -5979,6 +5986,7 @@ Παρουσιάστηκε ένα σφάλμα κατά την αναβάθμιση του Linux. Θα επαναφέρουμε το κοντέινερ χρησιμοποιώντας το αντίγραφο ασφαλείας σας. x (βέλτιστη) Επανατοποθετήστε το κλειδί ασφαλείας και δοκιμάστε ξανά +Αλλάξτε αυτήν τη ρύθμιση στη γραμμή διευθύνσεων. Η συσκευή στην οποία κοινοποιείτε δεν αποκρίθηκε. Δοκιμάστε ξανά. Λυπούμαστε, ο διαχειριστής σας έχει απενεργοποιήσει τον εξωτερικό χώρο αποθήκευσης στον λογαριασμό σας. Προεπιλεγμένη ταπετσαρία @@ -7732,6 +7740,7 @@ αρχείο λήψης Αυτή η διαδικασία μπορεί να διαρκέσει μερικά λεπτά. Λήψη του εικονικού μηχανήματος. Άνοιγμα Συνδέσμου σε Νέα Καρτέ&λα +Απενεργοποιήσατε τη Βελτιωμένη Ασφαλή περιήγηση στον λογαριασμό σας. Ο οργανισμός σας δεν έχει ενεργοποιήσει το Google Play Store για τον λογαριασμό σας. Για περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας. Γρήγορη Gmail diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 8e16d8fdce19f8..be6a15db5facaf 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb @@ -416,6 +416,7 @@ • Delete cookies and other temporary site data Bookmarks, history and saved passwords won't be affected. +Access code not recognised Yes is blocked Click Try Again, and accept the prompt on your computer @@ -583,6 +584,7 @@ Save payment method Linux is upgrading Available +Bluetooth is turned off. To see available devices, turn Bluetooth on. Updates are disabled by your administrator. Access the page debugger backend Apply @@ -1144,6 +1146,7 @@ You can manage this account’s settings by installing the Family Link app on yo Cast tab Edit Bookmark Search destinations +You don't have permission to cast to this display Add ""? Invalid tab index entered. Add printers to your profile @@ -2612,6 +2615,7 @@ and Ctrl+Alt+Brightness down to zoom out. Read your accessibility settings {NUM_FILES,plural, =1{It has permanent access to one file.}other{It has permanent access to # files.}} TrackPoint acceleration +You have entered an incorrect access code too many times. Try again later Untrusted Extension Icon Chrome detected that some of your settings were corrupted by another program and reset them to their original defaults. @@ -2695,6 +2699,7 @@ and Ctrl+Alt+Brightness down to zoom out. Enter PIN to pair with To remove apps, go to Settings > Google Play Store > Manage Android preferences > Apps or Application manager. Then tap the app that you want to uninstall (you may need to swipe right or left to find the app). Then tap Uninstall or Disable. Show inline writing suggestions that appear as you type +Turn on enhanced security? Report a bug Chrome saved your password to this device, but you can save it to your Google Account instead. Then, all passwords in your Google Account will also be available while you're signed in. Get your child to keep lifting their finger to save the fingerprint @@ -3210,6 +3215,7 @@ and Ctrl+Alt+Brightness down to zoom out. You can install up to eSIM profiles on this device. To add another profile, first remove an existing profile. Terms of Service Smart Lock is turned on +Turn off enhanced security? Update Password Unpin Anti-virus software failed unexpectedly while scanning this file. @@ -4684,6 +4690,7 @@ You can assign multiple switches to this action. will pause soon You're running from its disk image. Installing it on your computer lets you run it without the disk image and ensures that it will be kept up to date. Automatically sends usage statistics and crash reports to Google +Network communication issues Search or type web address OK, got it Saved passwords @@ -5978,6 +5985,7 @@ You can assign multiple switches to this action. There was an error while upgrading Linux. We'll restore the container using your backup. x (Best) Reinsert your security key and try again +Change this setting in the address bar. The device that you're sharing with didn't respond. Try again. Sorry, your administrator has disabled external storage on your account. Default wallpaper @@ -7733,6 +7741,7 @@ Keep your key file in a safe place. You will need it to create new versions of y download This process may take a few minutes. Downloading the virtual machine. Open Link in New &Tab +You turned off Enhanced Safe Browsing in your account. Your organisation has not enabled Google Play Store for your account. Contact your administrator for more information. Faster Gmail diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index ffbe16f0038038..c44241f52debbe 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb @@ -2500,6 +2500,7 @@ y Ctrl + Alt + Disminuir brillo para alejar. Establece restricciones de sitios web y limita el tiempo de uso con Family Link No se pudo instalar la política en el dispositivo. Tiempo restante: +Recibe una confirmación con vibración cuando dividas la pantalla o cambies de escritorio. &Corrección ortográfica Este proceso puede demorar unos minutos. Se está configurando el contenedor de Linux. Accede a las pestañas recientes de Chrome de tu teléfono. @@ -4899,6 +4900,7 @@ Puedes asignar varios interruptores a esta acción. Revisa el teléfono Configura tu motor de búsqueda predeterminado para el navegador Chrome y el Selector de Para usar Smart Lock, cambia al perfil del usuario principal en tu teléfono +Se guardaron estos registros en Mis archivos como Cambiar la configuración de idioma y de entrada de texto Elegir como nombre del dispositivo Fijar esta página a la Pantalla de inicio... @@ -5675,6 +5677,7 @@ Puedes asignar varios interruptores a esta acción. Llave de seguridad externa o sensor integrado {NUM_EXTENSIONS,plural, =1{Se rechazó una extensión}other{Se rechazaron # extensiones}} Se completó la actualización +Fuerza del clic Falta la bandeja de papel La operación de escritura excede la longitud máxima del atributo de: "". Tienes 1 impresora guardada. @@ -6805,6 +6808,7 @@ Mantén el archivo de clave en un lugar seguro. Debes crear las nuevas versiones Grupo - - Diálogo de conexión Google Cloud Print +Respuesta táctil Imprimir como imagen Los datos de las apps pueden incluir cualquier información que haya guardado una app (en función de la configuración del desarrollador), incluso datos como contactos, mensajes y fotos. Los datos de la copia de seguridad no inciden en la cuota de almacenamiento en Drive de tu hijo. diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 02409e0a0d8567..bfad85037700e0 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb @@ -2503,6 +2503,7 @@ Puedes gestionar la configuración de esta cuenta instalando la aplicación Fami Define restricciones de sitios web y límites de tiempo de pantalla con Family Link Se ha producido un error al instalar la política en el dispositivo. Tiempo restante aproximado: +Recibe una vibración de confirmación de acciones, como dividir la pantalla y cambiar de escritorio. Revi&sión ortográfica Este proceso puede tardar unos minutos. Iniciando el contenedor de Linux. Visualiza las pestañas de Chrome recientes de tu teléfono @@ -4901,6 +4902,7 @@ Exponente público ( bits): Comprueba tu teléfono Establece el buscador predeterminado para el navegador Chrome y el menú de aplicaciones de Si quieres usar Smart Lock, cambia al perfil del usuario principal en tu teléfono. +Estos registros se han guardado en Mis archivos como Cambiar configuración de idioma y de introducción de texto Elegir como nombre del dispositivo Fijar esta página en la pantalla de inicio... @@ -5677,6 +5679,7 @@ Exponente público ( bits): Llave de seguridad externa o sensor integrado {NUM_EXTENSIONS,plural, =1{Se ha rechazado 1 extensión}other{Se han rechazado # extensiones}} Actualización completada +Intensidad de clic Falta una bandeja de papel La operación de escritura supera la longitud máxima permitida del atributo para "". Tienes 1 impresora guardada. @@ -6807,6 +6810,7 @@ Guarda tu archivo de clave en un lugar seguro, ya que lo necesitarás para crear Grupo - - Cuadro de diálogo de conexión Google Cloud Print +Vibración al pulsar Imprimir como imagen Los datos de aplicaciones pueden ser cualquier tipo de información que guarden las aplicaciones (según la configuración de los desarrolladores), como contactos, mensajes y fotos. Los datos de la copia de seguridad no se tienen en cuenta para calcular el espacio de almacenamiento de la cuenta de Google Drive de tu hijo. diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index c9fb5f46d52cfd..26310cdf6ac7ab 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb @@ -2509,6 +2509,7 @@ väljasuumimiseks klahvikombinatsiooni Ctrl + Alt + Ereduse vähendamine.Seadke teenusega Family Link veebisaitide ja ekraaniaja piirangud Reeglit ei õnnestunud seadmesse installida. Ligikaudu jäänud +Saate värinkinnituse toimingute puhul, nagu jagatud ekraanikuva ja töölaudade vahetamine. &Õigekirjakontroll Protsess võib võtta mõne minuti. Linuxi konteinerit seadistatakse. Vaadake telefonis oma hiljutisi Chrome'i vahelehti @@ -4908,6 +4909,7 @@ Saate sellele toimingule määrata mitu lülitit. Kontrollige oma telefoni Määrake Chrome’i brauseri ja seadme rakenduse Käivitaja jaoks vaikeotsingumootor Funktsiooni Smart Lock kasutamiseks lülitage telefonis peamisele kasutajaprofiilile +Need logid salvestati jaotisse Minu failid nimega Keele ja sisestusseadete muutmine Määra seadme nimeks Kinnita see leht avakuvale ... @@ -5684,6 +5686,7 @@ Saate sellele toimingule määrata mitu lülitit. Väline turvavõti või sisseehitatud andur {NUM_EXTENSIONS,plural, =1{Laiendus lükati tagasi}other{# laiendust lükati tagasi}} Üleminek uuemale versioonile on lõpule viidud +Kliki tugevus Paberisalv puudub Kirjutamistoiming ületab atribuudi maksimumpikkust: „”. Teil on 1 salvestatud printer. @@ -6814,6 +6817,7 @@ Hoidke oma võtmefail kindlas kohas. Teil läheb seda oma laiendi uute versiooni Grupp Ühenduse dialoog Google'i pilvprintimine +Värintagasiside Prindi kujutisena Rakenduse andmed võivad olla mis tahes andmed, mille rakendus on salvestanud (arendaja seadete põhjal), sh andmed, nagu kontaktid, sõnumid ja fotod. Varundatud andmeid ei loeta teie lapse Drive'i salvestuskvoodi hulka. diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 8ebb1a73477614..ee2f57d9f0a9b5 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb @@ -2517,6 +2517,7 @@ ja loitonna painamalla Ctrl + Alt + kirkkauden vähennys. Aseta verkkosivustojen ja käyttöajan rajoituksia Family Linkillä Käytännön asentaminen laitteelle epäonnistui. Noin jäljellä +Saat värinävahvistuksen näytön jakamisesta, työpöydän vaihtamisesta ja muista tapahtumista. Oikoluku (&S) Tämä voi kestää muutaman minuutin. Linux-säilöä käynnistetään. Katso viimeaikaiset Chrome-välilehdet puhelimeltasi @@ -4914,6 +4915,7 @@ Julkinen eksponentti ( bittiä): Tarkista puhelimesi Valitse oletushakukone Chrome-selainta ja käynnistysohjelmaa () varten Jos haluat käyttää Smart Lockia, vaihda ensisijaiseen käyttäjäprofiiliin puhelimellasi +Lokit on tallennettu Omiin tiedostoihin: Vaihda kielen ja syöttötavan asetuksia Valitse laitteen nimeksi Kiinnitä tämä sivu aloitusruutuun... @@ -5690,6 +5692,7 @@ Julkinen eksponentti ( bittiä): Ulkoinen suojausavain tai sisäänrakennettu anturi {NUM_EXTENSIONS,plural, =1{Laajennus on hylätty}other{# laajennusta on hylätty}} Päivitys valmis +Klikkausherkkyys Paperilokero puuttuu Kirjoitustoiminto ylittää attribuutin enimmäispituuden laitteella . Olet tallentanut yhden tulostimen. @@ -6819,6 +6822,7 @@ Tallenna avaintiedosto suojattuun sijaintiin. Tarvitset sitä, jos haluat luoda Ryhmä Yhteyden valintaikkuna Google Cloud Print +Haptinen palaute Tulosta kuvana Sovellustiedot voivat olla mitä tahansa tietoja, joita sovellus on tallentanut (kehittäjän asetusten perusteella), mukaan lukien yhteystietoja, viestejä ja kuvia. Varmuuskopioidut tiedot eivät kuluta lapsesi tallennustilaa Drivessa. diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 1db483ba74667d..386215ef2b2b54 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb @@ -3815,6 +3815,7 @@ Souhaitez-vous lancer ? «  » veut se connecter à un port de série Ce service d'authentification est hébergé par Pour configurer une empreinte digitale, demandez à votre enfant de toucher l'interrupteur. Les données liées à l'empreinte digitale de votre enfant sont stockées de façon sécurisée et ne quittent jamais cet appareil : . +Vous profitez d'une protection standard {COUNT,plural, =1{un fichier}one{# fichier}other{# fichiers}} Actions Avatar orange par défaut @@ -4398,6 +4399,7 @@ Vous pouvez attribuer plusieurs commutateurs à cette action. Un problème avec la demande d'enregistrement du mode démo s'est produit. La réinitialisation de votre appareil n'a aucune incidence sur vos comptes Google ni sur leurs données synchronisées. Toutefois, tous les fichiers enregistrés localement sur votre appareil vont être supprimés. Connexion automatique +Traduction dans la langue suivante terminée : Vérification de pilote matériel Microsoft Windows Impossible d'associer l'appareil au domaine. Veuillez réessayer ou communiquer avec l'administrateur ou le propriétaire de votre appareil. Code d'erreur : . Menu principal @@ -7219,6 +7221,7 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la cr Ajouter des langues En cours de connexion. Échec du partage de connexion instantané +La navigation sécurisée améliorée est désactivée Oups! Une erreur s'est produite lorsque vous avez tenté de vous joindre au domaine. Veuillez réessayer. URL de renouvellement du certificat Netscape Son à chaque touche diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index e73d892d42ccad..9f953eb6983553 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb @@ -2504,6 +2504,7 @@ et Ctrl+Alt+Diminuer la luminosité pour faire un zoom arrière. Définissez des restrictions liées aux sites Web et des limites de temps d'utilisation avec Family Link Échec de l'installation de la règle sur l'appareil. Il reste environ +Une vibration confirme les actions comme le partage d'écran et le changement de bureau. &Correcteur orthographique Cette opération peut prendre quelques minutes. Configuration du conteneur Linux… Afficher les onglets Chrome récents de votre téléphone @@ -4904,6 +4905,7 @@ Assurez-vous de ne pas dévoiler d'informations sensibles. Vérifier le téléphone Définissez un moteur de recherche par défaut pour le navigateur Chrome et le Lanceur d'applications Pour utiliser Smart Lock, passez au profil de l'utilisateur principal sur votre téléphone +Ces journaux ont été enregistrés dans "Mes fichiers" en tant que Modifier les paramètres de langue et de saisie Nommer l'appareil Épingler cette page à l'écran de démarrage… @@ -5680,6 +5682,7 @@ Assurez-vous de ne pas dévoiler d'informations sensibles. Clé de sécurité externe ou capteur intégré {NUM_EXTENSIONS,plural, =1{Une extension a été refusée}one{# extension a été refusée}other{# extensions ont été refusées}} Mise à jour terminée +Sensibilité du clic Bac à papier manquant L'opération d'écriture dépasse la longueur maximale de l'attribut sur l'appareil . Vous avez 1 imprimante enregistrée. @@ -6810,6 +6813,7 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la cr Groupe  -  - Boîte de dialogue de connexion Google Cloud Print +Retour haptique Imprimer en tant qu'image Les données d'applications correspondent aux données de tous types enregistrées par des applications en fonction des paramètres définis par le développeur. Elles incluent potentiellement des données sensibles comme des contacts, des messages et des photos. Les données sauvegardées ne sont pas prises en compte dans le calcul du quota de stockage Drive de votre enfant. diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index cd4121d42cd161..f41ec710c63102 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb @@ -416,6 +416,7 @@ • izbrisati kolačiće i druge privremene podatke web-lokacije. To neće utjecati na oznake, povijest i spremljene zaporke. +Pristupna šifra nije prepoznata Da Aplikacija je blokirana Kliknite Pokušaj ponovo i prihvatite obavijest na računalu @@ -582,6 +583,7 @@ Spremanje načina plaćanja Linux se nadograđuje Dostupno +Bluetooth je isključen. Da biste vidjeli dostupne uređaje, uključite Bluetooth. Administrator je onemogućio ažuriranja. pristupiti pozadini programa za ispravljanje pogrešaka na stranici Primijeni @@ -1134,6 +1136,7 @@ Postavkama računa možete upravljati tako da instalirate aplikaciju Family Link Emitiraj karticu Uredi oznaku Pretražite odredišta +Nemate dopuštenje za emitiranje na tom zaslonu Dodati proširenje ""? Unesen je nevažeći indeks kartice. Dodajte pisače na svoj profil @@ -2506,6 +2509,7 @@ i Ctrl + Alt + Smanjivanje svjetline da biste smanjili prikaz. Postavite ograničenja web-lokacija i ograničenja vremena upotrebe uz Family Link Instalacija pravila na uređaju nije uspjela. Još približno +Primajte potvrde vibracijom za radnje kao što su razdjeljivanje zaslona i promjena radne površine. &Provjera pravopisa Taj postupak može potrajati nekoliko minuta. Postavlja se Linuxov spremnik. Pregledavajte nedavne Chromeove kartice s telefona @@ -2599,6 +2603,7 @@ i Ctrl + Alt + Smanjivanje svjetline da biste smanjili prikaz. čitati postavke pristupačnosti {NUM_FILES,plural, =1{Ima trajni pristup jednoj datoteci.}one{Ima trajni pristup # datoteci.}few{Ima trajni pristup do # datoteke.}other{Ima trajni pristup do # datoteka.}} TrackPoint ubrzanje +Unijeli ste netočnu pristupnu šifru previše puta. Pokušajte ponovo kasnije Nepouzdano Ikona proširenja Chrome je otkrio da je neki drugi program promijenio vaše postavke, pa ih je vratio na izvorne zadane vrijednosti. @@ -2682,6 +2687,7 @@ i Ctrl + Alt + Smanjivanje svjetline da biste smanjili prikaz. Unesite PIN za uparivanje s uređajem Za uklanjanje aplikacija idite na Postavke > Trgovina Play > Upravljanje postavkama Androida > Aplikacije ili Upravitelj aplikacija. Zatim dodirnite aplikaciju koju želite deinstalirati (možda ćete morati prijeći prstom udesno ili ulijevo kako biste pronašli aplikaciju). Zatim dodirnite Deinstaliraj ili Onemogući. Prikazuje prijedloge za pisanje u tekstu koji se prikazuju dok tipkate +Uključiti poboljšanu sigurnost? Prijava programske pogreške Chrome je spremio vašu zaporku na ovaj uređaj, no možete je spremiti na svoj Google račun. Tada će i sve zaporke na vašem Google računu biti dostupne dok ste prijavljeni. Neka dijete nastavi podizati prst kako bi se spremio otisak prsta @@ -3197,6 +3203,7 @@ i Ctrl + Alt + Smanjivanje svjetline da biste smanjili prikaz. Na ovom uređaju možete instalirati najviše eSIM profila. Da biste dodali još jedan profil, trebate ukloniti jedan od postojećih. Uvjeti upotrebe usluge Smart Lock uključen +Isključiti poboljšanu sigurnost? Ažuriraj zaporku Otkvači Antivirusni softver neočekivano je prekinuo s radom tijekom pretraživanja ove datoteke. @@ -4670,6 +4677,7 @@ Toj radnji možete dodijeliti više prekidača. Uskoro će se pauzirati Pokrećete program iz diskovne slike. Instaliranjem na računalu moći ćete ga pokrenuti u bilo kojem trenutku i uvijek će biti ažuran. Automatski šalje Googleu statistiku upotrebe i izvješća o rušenju +Poteškoće s mrežnom komunikacijom Potražite ili upišite web-adresu U redu, shvaćam Spremljene zaporke @@ -4905,6 +4913,7 @@ Toj radnji možete dodijeliti više prekidača. Provjerite telefon Postavite zadanu tražilicu za preglednik Chrome i pokretač za Da biste upotrebljavali Smart Lock, prebacite se na primarni korisnički profil na telefonu. +Ti su zapisnici spremljeni u mapu Moje datoteke kao Promijenite postavke jezika i unosa Imenujte uređaj Prikvači ovu stranicu na zaslon Start... @@ -5681,6 +5690,7 @@ Toj radnji možete dodijeliti više prekidača. Vanjski sigurnosni ključ ili ugrađeni senzor {NUM_EXTENSIONS,plural, =1{Proširenje je odbijeno}one{Broj odbijenih proširenja: #}few{Broj odbijenih proširenja: #}other{Broj odbijenih proširenja: #}} Nadogradnja dovršena +Snaga klika Nema ladice za papir Operacija zapisivanja premašuje maksimalnu duljinu atributa za uređaj: "". Imate jedan spremljeni pisač. @@ -5962,6 +5972,7 @@ Toj radnji možete dodijeliti više prekidača. Došlo je do pogreške prilikom nadogradnje Linuxa. Vratit ćemo spremnik pomoću vaših sigurnosnih kopija. x (najbolje) Ponovo umetnite sigurnosni ključ i pokušajte opet +Promijenite tu postavku u adresnoj traci. Uređaj s kojim dijelite nije odgovorio. Pokušajte ponovo. Nažalost, vaš je administrator onemogućio vanjsku pohranu na vašem računu. Zadana pozadina @@ -6810,6 +6821,7 @@ Ključnu datoteku čuvajte na sigurnom mjestu. Trebat će vam za stvaranje novih Grupa Dijalog za povezivanje Google Cloud Print +Dodirna povratna informacija Ispiši kao sliku Podaci aplikacije mogu biti bilo koji podaci koje je aplikacija spremila (na temelju postavki razvojnog programera), uključujući potencijalno osjetljive podatke kao što su kontakti, poruke i fotografije. Podaci sigurnosne kopije ne ulaze u kvotu pohrane na Disku vašeg podređenog računa. @@ -7717,6 +7729,7 @@ Mislim da ta web-lokacija ne bi trebala biti blokirana! preuzmi Taj postupak može potrajati nekoliko minuta. Preuzima se virtualno računalo. Otvori vezu u novoj &kartici +Isključili ste poboljšano sigurno pregledavanje na svom računu. Vaša organizacija nije omogućila Trgovinu Google Play za vaš račun. Više informacija zatražite od administratora. Brže Gmail diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index bd2e5d3803b57c..f844b40ede21f7 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb @@ -2518,6 +2518,7 @@ dan Ctrl+Alt+Kurangi kecerahan untuk memperkecil. Setel pembatasan situs dan batas waktu pemakaian perangkat dengan Family Link Gagal menginstal kebijakan di perangkat. Sekitar lagi +Terima konfirmasi lewat getaran untuk tindakan seperti layar terpisah dan berpindah desktop. &Periksa ejaan Proses ini dapat memerlukan waktu beberapa menit. Menyiapkan container Linux. Lihat tab Chrome terbaru dari ponsel @@ -4918,6 +4919,7 @@ Anda dapat menetapkan beberapa tombol akses untuk tindakan ini. Periksa ponsel Anda Setel mesin telusur default untuk browser Chrome dan Peluncur Untuk menggunakan Smart Lock, beralihlah ke profil pengguna utama di ponsel Anda +Log ini telah disimpan di File Saya sebagai Ubah setelan masukan dan bahasa Beri nama perangkat untuk Pasang pin halaman ini ke layar Awal... @@ -5694,6 +5696,7 @@ Anda dapat menetapkan beberapa tombol akses untuk tindakan ini. Kunci keamanan eksternal atau sensor dalam perangkat {NUM_EXTENSIONS,plural, =1{Ekstensi telah ditolak}other{# ekstensi telah ditolak}} Upgrade selesai +Kekuatan klik Baki kertas tidak ada Operasi menulis melebihi panjang maksimum atribut ke: "". Anda memiliki 1 printer tersimpan. @@ -6824,6 +6827,7 @@ Simpan file kunci Anda di tempat yang aman. Anda akan membutuhkannya untuk membu Grup - - Dialog Koneksi Google Cloud Print +Info via sentuhan Cetak sebagai gambar Data aplikasi dapat berupa data apa pun yang telah disimpan oleh aplikasi (berdasarkan setelan developer), termasuk data seperti kontak, pesan, dan foto. Data cadangan tidak akan mengurangi kuota penyimpanan Drive anak Anda. diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index c3b52efcb07806..099a0cf3ef000a 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb @@ -415,6 +415,7 @@ • Eliminare i cookie e gli altri dati temporanei dei siti Non avrà effetto su segnalibri, cronologia e password salvate. +Codice di accesso non riconosciuto L'app è bloccata Fai clic su Riprova e accetta la richiesta sul computer @@ -581,6 +582,7 @@ Salva il metodo di pagamento Upgrade di Linux… Disponibile +Il Bluetooth non è attivo. Attivalo per vedere i dispositivi disponibili. Gli aggiornamenti sono stati disattivati dall'amministratore. Accesso al backend del debugger delle pagine Applica @@ -1133,6 +1135,7 @@ Puoi gestire le impostazioni dell'account installando l'app Family Link su quest Trasmetti scheda Modifica Preferito Cerca destinazioni +Non hai l'autorizzazione per trasmettere a questo display Aggiungere ""? È stato inserito un indice di tabulazione non valido. Aggiungi stampanti al tuo profilo @@ -2504,6 +2507,7 @@ e Ctrl + Alt + Riduzione luminosità per diminuire lo zoom. Imposta limitazioni relative ai siti web e limiti per il tempo di utilizzo con Family Link Impossibile installare le norme sul dispositivo. Ancora circa +Ricevi una conferma tramite vibrazione per azioni quali la divisione dello schermo e il passaggio da una scrivania all'altra. &Controllo ortografico Questa procedura potrebbe richiedere alcuni minuti. Configurazione del container Linux in corso. Visualizza le schede recenti di Chrome del tuo telefono @@ -2597,6 +2601,7 @@ e Ctrl + Alt + Riduzione luminosità per diminuire lo zoom. Lettura delle impostazioni di accessibilità {NUM_FILES,plural, =1{Ha accesso permanente a un file.}one{It has permanent access to # files.}other{Ha accesso permanente a # file.}} Accelerazione TrackPoint +Hai inserito troppe volte un codice di accesso errato. Riprova più tardi. Non attendibile Icona dell'estensione Chrome ha rilevato che alcune impostazioni sono state danneggiate da un altro programma e le ha ripristinate con i valori originali predefiniti. @@ -2680,6 +2685,7 @@ e Ctrl + Alt + Riduzione luminosità per diminuire lo zoom. Inserisci il PIN per eseguire l'accoppiamento con Per rimuovere le app apri Impostazioni > Google Play Store > Gestisci le preferenze Android > App o Gestione applicazioni, quindi tocca l'app che vuoi disinstallare (potresti dover scorrere verso sinistra o verso destra per trovarla) e infine tocca Disinstalla o Disattiva. Vengono mostrati suggerimenti di scrittura incorporati visualizzati durante la digitazione +Vuoi attivare la sicurezza avanzata? Segnala un bug Chrome ha salvato la tua password su questo dispositivo, ma puoi salvarla sul tuo Account Google se preferisci. Se lo fai, saranno disponibili anche tutte le password sul tuo Account Google quando avrai eseguito l'accesso. Chiedi a tuo figlio di continuare a sollevare il dito per salvare l'impronta @@ -3195,6 +3201,7 @@ e Ctrl + Alt + Riduzione luminosità per diminuire lo zoom. Puoi installare fino a profili eSIM su questo dispositivo. Per aggiungere un altro profilo, prima rimuovine uno esistente. Termini di servizio Funzione Smart Lock attiva +Vuoi disattivare la sicurezza avanzata? Aggiorna password Sblocca La scansione del software antivirus non è inaspettatamente riuscita durante la scansione di questo file. @@ -4668,6 +4675,7 @@ Puoi assegnare più sensori a questa azione. L'app verrà presto messa in pausa Stai eseguendo dall'immagine disco. L'installazione sul computer permette di eseguirlo senza immagine disco e ne garantisce l'aggiornamento. Invia automaticamente a Google statistiche sull'utilizzo e report sugli arresti anomali +Problemi di comunicazione di rete Cerca o digita un indirizzo web OK Password salvate @@ -4903,6 +4911,7 @@ Puoi assegnare più sensori a questa azione. Controlla il tuo telefono Imposta il tuo motore di ricerca predefinito per il browser Chrome e Avvio app di Per usare Smart Lock, passa al profilo utente principale del telefono +Questi log sono stati salvati in I miei file come Modifica impostazioni della lingua e di immissione Cambia il nome del dispositivo in Blocca questa pagina in schermata iniziale... @@ -5679,6 +5688,7 @@ Puoi assegnare più sensori a questa azione. Token di sicurezza esterno o sensore integrato {NUM_EXTENSIONS,plural, =1{Un'estensione è stata rifiutata}one{# estensioni sono state rifiutate}other{# estensioni sono state rifiutate}} Upgrade completato +Intensità clic Vassoio carta mancante La scrittura supera la lunghezza massima dell'attributo per: "". Hai una stampante salvata. @@ -5960,6 +5970,7 @@ Puoi assegnare più sensori a questa azione. Si è verificato un errore durante l'upgrade di Linux. Ripristineremo il contenitore usando la tua copia di backup. x (opzione migliore) Inserisci di nuovo il token di sicurezza e riprova +Cambia questa impostazione nella barra degli indirizzi. Il dispositivo con cui hai tentato di condividere il file non ha risposto. Riprova. Spiacenti, l'amministratore ha disabilitato l'archiviazione esterna per il tuo account. Sfondo predefinito @@ -6809,6 +6820,7 @@ Conserva il file di chiave in un luogo sicuro. Ti servirà per creare nuove vers Gruppo - - Finestra di dialogo di connessione Google Cloud Print +Feedback aptico Stampa come immagine Per dati delle app si intende qualsiasi dato salvato nell'app (in base alle impostazioni sviluppatore), inclusi dati come contatti, messaggi e foto. I dati di backup non vengono considerati per la quota di spazio di archiviazione di Drive. @@ -7715,6 +7727,7 @@ Conserva il file di chiave in un luogo sicuro. Ti servirà per creare nuove vers download Questa procedura potrebbe richiedere alcuni minuti. Download della macchina virtuale in corso. Apri link in un'altra &scheda +Hai disattivato la Navigazione sicura avanzata nel tuo account. La tua organizzazione non ha attivato Google Play Store per il tuo account. Contatta l'amministratore per avere ulteriori informazioni. Più veloce Gmail diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 190340764ea1a7..56d594876051fb 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb @@ -1478,7 +1478,7 @@ לאתר יש גישה למיקום שלך תרגום הדף אירעה שגיאה -הגדרות אתר +ההגדרות לאתרים ‏יש לכבות את Windows כדי להסיר את . הסריקה האוטומטית מושבתת כי הגדרת כמה מתגים. הרשאות של קובץ מדיה עבור "" @@ -2518,6 +2518,7 @@ ‏הגדרה של הגבלות גישה לאתרים וזמן מסך בעזרת Family Link התקנת המדיניות במכשיר נכשלה. הזמן הנותר: בערך +קבלת אישור ברטט על ביצוע פעולות כמו פיצול המסך והחלפת שולחן העבודה הווירטואלי. &בדיקת איות ‏התהליך הזה עשוי להימשך כמה דקות. מתבצעת הגדרה של מאגר Linux. ‏הצגת כרטיסיות Chrome אחרונות בטלפון @@ -4918,6 +4919,7 @@ בדיקת הטלפון ‏עליך להגדיר את מנוע החיפוש שיוגדר כברירת המחדל לדפדפן Chrome ולמרכז האפליקציות של ‏כדי להשתמש ב-Smart Lock יש לעבור אל פרופיל המשתמש הראשי בטלפון +היומנים האלה נשמרו ב'קבצים שלי' בתור שינוי הגדרות הקלט והשפה שמירת שם המכשיר הצמדת דף זה למסך הפתיחה... @@ -5694,6 +5696,7 @@ מפתח אבטחה חיצוני או חיישן מובנה {NUM_EXTENSIONS,plural, =1{בקשת הארכה נדחתה}two{# בקשות הארכה נדחו}many{# בקשות הארכה נדחו}other{# בקשות הארכה נדחו}} השדרוג הסתיים +עוצמת הלחיצה חסר מגש נייר פעולת הכתיבה חורגת מהאורך המרבי של התכונה במכשיר: "". שמרת מדפסת אחת. @@ -6823,6 +6826,7 @@ קבוצה ‏– ‏– תיבת דו-שיח לחיבור Google Cloud Print +משוב פיזי הדפסה כתמונה נתוני אפליקציות הם כל הנתונים הנשמרים באפליקציות (בהתאם להגדרות המפתחים), כולל נתונים כמו אנשי קשר, הודעות ותמונות. נתוני הגיבוי אינם תופסים חלק מהמכסה של חשבון הילד/ה שלך ב-Drive. diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index cf9c8eca858abb..69eb7ec0256ed7 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb @@ -2518,6 +2518,7 @@ Family Link를 사용해 웹사이트 제한사항 및 기기 사용 시간 제한 설정 기기에 정책을 설치하지 못했습니다. 남음 +화면 분할, 데스크 전환 등의 작업을 진동으로 확인할 수 있습니다. 맞춤법 검사(&S) 이 과정은 몇 분 정도 걸릴 수 있습니다. Linux 컨테이너를 설정합니다. 휴대전화의 최근 Chrome 탭을 봅니다. @@ -4915,6 +4916,7 @@ 휴대전화 확인 Chrome 브라우저 및 런처에서 사용할 기본 검색엔진을 설정하세요. Smart Lock을 사용하려면 휴대전화의 기본 사용자 프로필로 전환하세요. +로그가 내 파일에 다음 이름으로 저장됨: 언어 및 입력 설정 변경 기기 이름을 다음으로 지정: 이 페이지를 시작 화면에 고정... @@ -5691,6 +5693,7 @@ 외장 보안 키 또는 내장 센서 {NUM_EXTENSIONS,plural, =1{확장 프로그램 1개 거부됨}other{확장 프로그램 #개 거부됨}} 업그레이드 완료 +클릭 강도 용지함 없음 기기()의 쓰기 작업이 최대 속성 길이를 초과합니다. 저장된 프린터가 1대 있습니다. @@ -6821,6 +6824,7 @@ 그룹 - - 연결 대화상자 Google 클라우드 프린트 +햅틱 반응 이미지로 인쇄 앱 데이터에는 연락처, 메시지, 사진 등 앱에서 개발자 설정에 따라 저장한 모든 데이터가 포함될 수 있습니다. 백업 데이터는 자녀의 드라이브 스토리지 용량에 포함되지 않습니다. diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index d5529a25a0edc6..0437044c4523f3 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb @@ -1466,7 +1466,7 @@ Varat pārvaldīt šī konta iestatījumus, savā ierīcē instalējot lietotni Piekļuve atrašanās vietai atļauta Tulkot šo lapu Radās kļūda -Vietnes iestatījumi +Vietņu iestatījumi Lai atinstalētu , izslēdziet Windows datoru. Tā kā iestatījāt vairākus slēdžus, automātiskā pārlūkošana ir izslēgta. Multivides faila atļaujas paplašinājumam “ @@ -2505,6 +2505,7 @@ Saskaņā ar domēna prasībām viedkartei ir jābūt ievie Iestatīt vietņu ierobežojumus un izmantošanas ilguma ierobežojumus, izmantojot Family Link Neizdevās ierīcē instalēt politiku. Aptuvenais atlikušais laiks: +Saņemiet apstiprinājumu ar vibrāciju tādām darbībām kā ekrāna sadalīšana un darbvietu pārslēgšana. &Pareizrakstības pārbaude Šis process var ilgt dažas minūtes. Notiek Linux konteinera iestatīšana. Skatiet nesen atvērtās Chrome cilnes no sava tālruņa. @@ -4904,6 +4905,7 @@ Vai vēlaties palaist rīku ?Pārbaudiet savu tālruni Iestatiet noklusējuma meklētājprogrammu pārlūkam Chrome un palaidējam. Lai izmantotu Smart Lock, pārslēdzieties uz tālruņa primāro lietotāja profilu +Šie žurnāli ir saglabāti mapē “Mani faili” kā Mainīt valodas un ievades iestatījumus Piešķirt ierīcei nosaukumu Piespraust šo lapu sākuma ekrānam... @@ -5680,6 +5682,7 @@ Saskaņā ar domēna prasībām viedkartei ir jābūt ievie Ārējā drošības atslēga vai iebūvēts sensors {NUM_EXTENSIONS,plural, =1{Paplašinājums ir noraidīts}zero{# paplašinājumi ir noraidīti}one{# paplašinājums ir noraidīts}other{# paplašinājumi ir noraidīti}} Jaunināšana pabeigta +Klikšķa stiprums Nav papīra trauka Rakstīšanas darbība pārsniedz atribūta maksimālo garumu šajā ierīcē: “”. Jums ir viens saglabāts printeris. @@ -6809,6 +6812,7 @@ Glabājiet atslēgas failu drošā vietā. Tas būs vajadzīgs, lai izveidotu ja Grupas  () statuss:  Savienojuma dialoglodziņš Google mākoņdruka +Vibrācija Drukāt kā attēlu Lietotņu dati var būt jebkādi lietotņu saglabātie dati (atkarībā no izstrādātāja iestatījumiem), tostarp tādi dati kā kontaktpersonas, ziņojumi un fotoattēli. Dublētie dati netiek ieskaitīti jūsu bērna Diska krātuves kvotā. @@ -7021,7 +7025,7 @@ Glabājiet atslēgas failu drošā vietā. Tas būs vajadzīgs, lai izveidotu ja Izlaist Veidojot savienojumu ar ierīci , autentifikācijas kods tika noraidīts. visās vietnēs -Paraksti +Subtitri Pierakstīties Meklēt pēc API izsaukuma/URL Vai atinstalēt lietotni ? diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 59da8e07499061..9af434f9d7fc34 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb @@ -417,6 +417,7 @@ • ќе ги избрише колачињата и другите привремени податоци од сајтовите Обележувачите, историјата и зачуваните лозинки нема да бидат засегнати. +Кодот за пристап не се препознава Да е блокирана Кликнете „Обиди се пак“ и прифатете го прашањето на компјутерот @@ -584,6 +585,7 @@ Зачувај го начинот на плаќање Linux се надградува Достапно +Bluetooth е исклучено. За да видите достапни уреди, вклучете Bluetooth. Ажурирањата се оневозможени од администраторот. Пристапете кон задниот дел на отстранувачот на грешки на страница Примени @@ -1145,6 +1147,7 @@ Картичка за емитување Измени Обележувач Пребарај дестинации +Немате дозвола за емитување на екранов Додај „“? Внесен е неважечки индекс на картичката. Додајте печатачи на профилот @@ -2612,6 +2615,7 @@ Прочитајте ги поставките за пристапност {NUM_FILES,plural, =1{Има постојан пристап до една датотека.}one{Има постојан пристап до # датотека.}other{Има постојан пристап до # датотеки.}} Забрзување на TrackPoint +Внесовте премногу неточни кодови за пристап. Обидете се повторно подоцна Недоверливи Икона за екстензијата Chrome откри дека некои од поставките на прелистувачот ги оштетила друга програма и ги ресетирала на првичните стандардни вредности. @@ -2695,6 +2699,7 @@ Внесете PIN за спарување со За да ги отстраните апликациите, одете во „Поставки > Google Play Store > Управувајте со поставките за Android > Апликации“ или „Управникот со апликации“. Потоа допрете ја апликацијата што сакате да ја деинсталирате (можеби ќе треба да повлечете десно или лево за да ја најдете). Потоа допрете „Деинсталирај“ или „Оневозможи“. Прикажувај предлози за пишување во текот на пишувањето +Да се вклучи подобрената безбедност? Пријавете грешка Chrome ја зачува лозинката на уредов, но може да ја зачувате на вашата сметка на Google наместо тоа. Потоа, сите лозинки во вашата сметка на Google ќе бидат исто така достапни додека сте најавени. Кажете му на детето постојано да го крева прстот за да се зачува отпачатокот @@ -3210,6 +3215,7 @@ Може да инсталирате до профили на eSIM на уредов. За да додадете друг профил, прво отстранете го постојниот профил. Услови за користење Smart Lock е вклучен +Да се исклучи подобрената безбедност? Ажурирање на лозинката Откачи Анти-вирус софтверот не успеа да ја скенира датотеката. @@ -4684,6 +4690,7 @@ ќе се паузира наскоро Го активиравте производот од неговата слика на дискот. Со негово инсталирање на компјутер, може да го активирате без сликата на диск и се обезбедува дека ќе биде ажурен. Автоматски испраќа статистика на користењето и извештаи за падовите до Google. +Проблеми со мрежната комуникација Пребарувајте или внесете адреса Добро, сфатив Зачувани лозинки @@ -5976,6 +5983,7 @@ Имаше грешка при надградувањето на Linux. Ќе го вратиме контејнерот од вашиот бекап. x (најдобра) Вметнете го безбедносниот клуч пак и обидете се повторно +Променете ја поставкава во лентата за адреси. Уредот со којшто споделувате не одговори. Обидете се повторно. За жал, администраторот оневозможил надворешно складирање на сметката. Стандарден тапет @@ -7733,6 +7741,7 @@ преземање Овој процес можеби ќе потрае неколку минути. Се презема виртуелната машина. Отвори ја врската во нова &картичка +Исклучивте „Подобрено безбедно прелистување“ во вашата сметка. Организацијата не ја овозможила Google Play Store за вашата сметка. Контактирајте со администраторот за повеќе информации. Побрзо Gmail diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 5828e3d33ee891..905accb8a2e55b 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb @@ -416,6 +416,7 @@ • കുക്കികളും മറ്റ് താൽക്കാലിക സൈറ്റ് ഡാറ്റയും ഇല്ലാതാക്കും ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, സംരക്ഷിച്ച പാസ്‌വേഡുകൾ എന്നിവയെ ബാധിക്കില്ല. +ആക്‌സസ് കോഡ് തിരിച്ചറിഞ്ഞില്ല അതെ ബ്ലോക്ക് ചെയ്‌തിരിക്കുന്നു 'വീണ്ടും ശ്രമിക്കുക' എന്നതിൽ ക്ലിക്ക് ചെയ്‌ത ശേഷം, നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ നിർദ്ദേശം അംഗീകരിക്കുക @@ -579,6 +580,7 @@ പേയ്മെന്റ് രീതി സംരക്ഷിക്കുക Linux അപ്‍ഗ്രേഡ് ചെയ്യുന്നു ലഭ്യം +Bluetooth ഓഫാക്കിയിരിക്കുന്നു. ലഭ്യമായ ഉപകരണങ്ങൾ കാണാൻ Bluetooth ഓണാക്കുക. അപ്‌ഡേറ്റുകളെ നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റര്‍ പ്രവർത്തനരഹിതമാക്കി. പേജ് ഡീബഗ്ഗർ ബാക്ക്എൻഡ് ആക്‌സസ് ചെയ്യുക പ്രയോഗിക്കുക @@ -1131,6 +1133,7 @@ കാസ്റ്റ് ടാബ് ബുക്മാര്‍ക്ക് എഡിറ്റ് ചെയ്യുക ലക്ഷ്യസ്ഥാനങ്ങൾ തിരയുക +ഈ ഡിസ്പ്ലേ കാസ്റ്റ് ചെയ്യാൻ നിങ്ങൾക്ക് അനുമതിയില്ല "" ചേർക്കണോ? അസാധുവായ ടാബ് സൂചികയാണ് നൽകിയത്. നിങ്ങളുടെ പ്രൊഫൈലിലേക്ക് പ്രിന്ററുകൾ ചേർക്കുക @@ -2596,6 +2599,7 @@ നിങ്ങളുടെ ഉപയോഗസഹായി ക്രമീകരണങ്ങൾ റീഡ് ചെയ്യുക {NUM_FILES,plural, =1{ഇതിന് ഒരു ഫയലിലേക്ക് ശാശ്വതമായ ആക്‌സസ്സ് ഉണ്ട്.}other{ഇതിന് # ഫയലുകളിലേക്ക് ശാശ്വതമായ ആക്‌സസ്സ് ഉണ്ട്.}} TrackPoint ആക്സിലറേഷൻ +നിങ്ങൾ നിരവധി തവണ തെറ്റായ ആക്‌സസ് കോഡ് നൽകി. പിന്നീട് വീണ്ടും ശ്രമിക്കുക വിശ്വസ്തമല്ലാത്തത് വിപുലീകരണ ഐക്കൺ മറ്റൊരു പ്രോഗ്രാം നിങ്ങളുടെ ചില ക്രമീകരണങ്ങൾക്ക് കേടുവരുത്തി അവയുടെ യഥാർത്ഥ ഡിഫോൾട്ട് ക്രമീകരണങ്ങളിലേക്ക് അവ റീസെറ്റ് ചെയ്തതായി Chrome കണ്ടെത്തി. @@ -2679,6 +2683,7 @@ എന്നതുമായി ജോടിയാക്കാൻ പിൻ നൽകുക ആപ്പുകൾ നീക്കം ചെയ്യാൻ, ക്രമീകരണം > Google Play Store > Android മുൻഗണനകൾ മാനേജ് ചെയ്യുക > ആപ്പുകൾ അല്ലെങ്കിൽ ആപ്പ് മാനേജർ എന്നതിലേക്ക് പോവുക. അൺഇൻസ്‌റ്റാൾ ചെയ്യാനാഗ്രഹിക്കുന്ന ആപ്പിൽ ടാപ്പ് ചെയ്യുക (ആപ്പ് കണ്ടെത്താൻ വലത്തോട്ടോ ഇടത്തോട്ടോ സ്വൈപ്പ് ചെയ്യേണ്ടതായി വന്നേക്കാം). തുടർന്ന്, അൺഇൻസ്‌റ്റാൾ ചെയ്യുക എന്നതിലോ പ്രവർത്തനരഹിതമാക്കുക എന്നതിലോ ടാപ്പ് ചെയ്യുക. നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്നതിന് അനുസരിച്ച് ദൃശ്യമാകുന്ന ഇൻലൈൻ എഴുത്ത് നിർദ്ദേശങ്ങൾ കാണിക്കുക +മെച്ചപ്പെടുത്തിയ സുരക്ഷ ഓണാക്കണോ? ഒരു ബഗ് റിപ്പോര്‍ട്ടുചെയ്യുക Chrome നിങ്ങളുടെ പാസ്‌വേഡ് ഈ ഉപകരണത്തിൽ സംരക്ഷിച്ചു, എന്നാൽ അതിന് പകരം നിങ്ങൾക്കത് Google അക്കൗണ്ടിൽ സംരക്ഷിക്കാനാകും. അപ്പോൾ നിങ്ങളുടെ Google അക്കൗണ്ടിലെ എല്ലാ പാസ്‌വേഡുകളും നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിരിക്കുമ്പോൾ ലഭ്യമാകും. ഫിംഗർപ്രിന്റ് സംരക്ഷിക്കുന്നതിന്, വിരൽ ഉയർത്തുന്നത് തുടരാൻ നിങ്ങളുടെ കുട്ടിയോട് ആവശ്യപ്പെടുക @@ -3193,6 +3198,7 @@ ഈ ഉപകരണത്തിൽ ഇ-സിം പ്രൊഫൈലുകൾ വരെ ഇൻസ്റ്റാൾ ചെയ്യാം. മറ്റൊരു പ്രൊഫൈൽ ചേർക്കാൻ നിലവിലുള്ള ഒരു പ്രൊഫൈൽ നീക്കം ചെയ്യുക. സേവന നിബന്ധനകൾ Smart Lock ഓണാണ് +മെച്ചപ്പെടുത്തിയ സുരക്ഷ ഓഫാക്കണോ? പാസ്‌വേഡ് അപ്‌ഡേറ്റ് ചെയ്യുക പിൻചെയ്യൽ മാറ്റുക ഈ ഫയൽ സ്‌കാൻ ചെയ്യുന്നതിൽ ആന്റി വൈറസ് സോഫ്റ്റ്‌വെയർ അപ്രതീക്ഷിതമായി പരാജയപ്പെട്ടു. @@ -4667,6 +4673,7 @@ ഉടൻ താൽക്കാലികമായി നിർത്തും നിങ്ങൾ , അതിന്റെ ഡിസ്‌ക് ചിത്രത്തിൽ നിന്ന് പ്രവർത്തിപ്പിക്കുന്നു. ഇത് നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത്, ഡിസ്‌ക് ചിത്രം ഇല്ലാതെ തന്നെ ഇത് പ്രവർത്തിപ്പിക്കാൻ നിങ്ങളെ അനുവദിക്കുകയും അപ് റ്റു ഡേറ്റായി നിലനിർത്തുമെന്ന് ഉറപ്പുവരുത്തുകയും ചെയ്യുന്നു. Google-ലേക്ക് സ്വയമേവ ഉപയോഗ വിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോര്‍ട്ടുകളും അയയ്ക്കുന്നു +നെറ്റ്‌വർക്ക് ആശയവിനിമയവുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങൾ വെബ് വിലാസം തിരയൂ/ ടൈപ്പ് ചെയ്യൂ മനസ്സിലായി സംരക്ഷിച്ച പാസ്‌വേഡുകള്‍ @@ -5962,6 +5969,7 @@ Linux അപ്‌ഗ്രേഡ് ചെയ്യുന്നതിനിടെ പിശകുണ്ടായി. നിങ്ങളുടെ ബാക്കപ്പ് ഉപയോഗിച്ച് ഞങ്ങൾ കണ്ടെയ്‌നർ പുനഃസ്ഥാപിക്കും. x (മികച്ചത്) സുരക്ഷാ കീ വീണ്ടും ബന്ധിപ്പിച്ച് വീണ്ടും ശ്രമിക്കുക +വിലാസ ബാറിൽ ഈ ക്രമീകരണം മാറ്റാം. നിങ്ങൾ ഫയൽ പങ്കിടാൻ ശ്രമിച്ച ഉപകരണം പ്രതികരിക്കുന്നില്ല. വീണ്ടും ശ്രമിക്കുക. ക്ഷമിക്കണം, അഡ്‌മിനിസ്‌ട്രേറ്റർ നിങ്ങളുടെ അക്കൗണ്ടിന്റെ എക്‌സ്‌റ്റേണൽ സ്‌റ്റോറേജ് പ്രവർത്തനരഹിതമാക്കി. ഡിഫോള്‍‌ട്ട് വാള്‍‌പേപ്പര്‍ @@ -7715,6 +7723,7 @@ ഡൗണ്‍‌ലോഡ് ചെയ്യുക ഈ പ്രക്രിയയ്ക്ക് കുറച്ച് സമയമെടുത്തേക്കാം. വെർച്വൽ മെഷീൻ ഡൗൺലോഡ് ചെയ്യുന്നു. പുതിയ &ടാബിൽ ലിങ്ക് തുറക്കുക +നിങ്ങളുടെ അക്കൗണ്ടിൽ മെച്ചപ്പെടുത്തിയ സുരക്ഷിത ബ്രൗസിംഗ് ഓഫാക്കിയിരിക്കുന്നു. നിങ്ങളുടെ അക്കൗണ്ടിന് വേണ്ടി ഓർഗനൈസേഷൻ, Google Play Store പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ല. കൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക. കൂടുതൽ വേഗതയുള്ളത് Gmail diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 8d9464fae7961d..6a07c68003d269 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb @@ -2518,6 +2518,7 @@ dan Ctrl+Alt+Kurangkan kecerahan untuk zum keluar. Tetapkan sekatan laman web & had masa skrin menggunakan Family Link Gagal memasang dasar pada peranti. Kira-kira lagi +Terima pengesahan getaran untuk tindakan seperti pisahkan skrin dan tukar meja. &Semak ejaan Proses ini mungkin mengambil masa beberapa minit. Menyediakan bekas Linux. Lihat tab Chrome baru-baru ini daripada telefon anda @@ -4918,6 +4919,7 @@ Anda boleh menetapkan berbilang suis kepada tindakan ini. Semak telefon anda Tetapkan enjin carian lalai anda untuk penyemak imbas Chrome dan Pelancar Untuk menggunakan Smart Lock, beralih kepada profil pengguna utama pada telefon anda +Log ini telah disimpan dalam Fail Saya sebagai Tukar tetapan bahasa dan input Namakan peranti kepada Pin halaman ini pada skrin Mula... @@ -5694,6 +5696,7 @@ Anda boleh menetapkan berbilang suis kepada tindakan ini. Kunci keselamatan luaran atau penderia terbina dalam {NUM_EXTENSIONS,plural, =1{Satu sambungan telah ditolak}other{# sambungan telah ditolak}} Peningkatan selesai +Klik kekuatan Dulang kertas tiada Pengendalian tulis melebihi panjang maksimum atribut pada: "". Anda mempunyai 1 pencetak yang disimpan. @@ -6824,6 +6827,7 @@ Simpan fail kunci anda di tempat selamat. Anda akan memerlukannya untuk mencipta Kumpulan - - Dialog Sambungan Cetakan Awan Google +Maklum balas haptik Cetak sebagai imej Data apl boleh jadi sebarang data yang telah disimpan oleh apl (berdasarkan tetapan pembangun), termasuk data seperti kenalan, mesej dan foto. Data sandaran tidak akan ditolak daripada kuota storan Drive anak anda. diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 3f3656617f8f81..f90b53bc9000b2 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb @@ -414,6 +414,7 @@ • Cookies en andere tijdelijke sitegegevens worden verwijderd Dit heeft geen gevolgen voor bookmarks, geschiedenis en opgeslagen wachtwoorden. +Toegangscode niet herkend Ja is geblokkeerd Klik op 'Opnieuw proberen' en accepteer de prompt op je computer @@ -580,6 +581,7 @@ Betaalmethode opslaan Linux wordt geüpgraded Beschikbaar +Bluetooth staat uit. Zet bluetooth aan om beschikbare apparaten te zien. Updates zijn uitgezet door je beheerder. Back-end voor foutopsporing van pagina openen Toepassen @@ -1132,6 +1134,7 @@ Je kunt de instellingen van dit account beheren door de Family Link-app op je ap Tabblad casten Bookmark bewerken Bestemmingen zoeken +Je hebt geen rechten om te casten naar dit scherm Wil je '' toevoegen? Ongeldige tabbladindex opgegeven. Printers aan je profiel toevoegen @@ -2502,6 +2505,7 @@ Als je later besluit dat je niet wilt dat je kind Voice Match gebruikt, verwijde Stel websitebeperkingen en limieten voor schermtijd in met Family Link Kan beleid niet op het apparaat installeren. Nog ongeveer +Krijg een trillingsbevestiging voor acties zoals scherm splitsen en tussen bureaus schakelen. &Spellingcontrole Dit proces kan enkele minuten duren. De Linux-container wordt ingesteld. Recente Chrome-tabbladen van je telefoon bekijken @@ -2595,6 +2599,7 @@ Als je later besluit dat je niet wilt dat je kind Voice Match gebruikt, verwijde Je toegankelijkheidsinstellingen lezen {NUM_FILES,plural, =1{De app heeft permanent toegang tot één bestand.}other{De app heeft permanent toegang tot # bestanden.}} TrackPoint-versnelling +Je hebt te vaak een onjuiste toegangscode opgegeven. Probeer het later opnieuw. Niet vertrouwd Extensiepictogram Chrome heeft gedetecteerd dat sommige van je instellingen zijn beschadigd door een ander programma en heeft de instellingen teruggezet naar de oorspronkelijke standaardwaarden. @@ -2678,6 +2683,7 @@ Als je later besluit dat je niet wilt dat je kind Voice Match gebruikt, verwijde Geef een pincode op om te koppelen met Als je apps wilt verwijderen, ga je naar Instellingen > Google Play Store > Android-voorkeuren beheren > Apps of App-beheer. Tik op de app die je wilt verwijderen (je moet mogelijk naar rechts of links swipen om de app te vinden). Tik vervolgens op Verwijderen of Uitzetten. Inline schrijfsuggesties laten zien terwijl je typt +Uitgebreide beveiliging aanzetten? Een fout melden Chrome heeft je wachtwoord opgeslagen op dit apparaat, maar in plaats daarvan kun je het wachtwoord ook opslaan in je Google-account. Dan zijn alle wachtwoorden in je Google-account ook beschikbaar als je bent ingelogd. Laat je kind de vinger steeds optillen om de vingerafdruk te bewaren @@ -3193,6 +3199,7 @@ Als je later besluit dat je niet wilt dat je kind Voice Match gebruikt, verwijde Je kunt maximaal e-simkaartprofielen installeren op dit apparaat. Als je nog een profiel wilt toevoegen, verwijder je eerst een bestaand profiel. Servicevoorwaarden Smart Lock staat aan +Uitgebreide beveiliging uitzetten? Wachtwoord updaten Losmaken Tijdens het scannen van dit bestand met antivirussoftware is er een onverwachte fout opgetreden. @@ -4664,6 +4671,7 @@ Je kunt meerdere schakelaars toewijzen aan deze actie. wordt straks onderbroken Je voert uit via de schijfkopie. Als je dit programma installeert op je computer, kun je dit uitvoeren zonder de schijfkopie te gebruiken en blijft het programma bijgewerkt. Hiermee worden automatisch gebruiksstatistieken en crashrapporten naar Google verzonden +Problemen met netwerkcommunicatie Zoek of typ een webadres OK, begrepen Opgeslagen wachtwoorden @@ -4899,6 +4907,7 @@ Je kunt meerdere schakelaars toewijzen aan deze actie. Controleer je telefoon Stel de standaard zoekmachine in voor de Chrome-browser en Launcher Als je Smart Lock wilt gebruiken, schakel je over naar het primaire gebruikersprofiel op je telefoon +Deze logboeken zijn opgeslagen in Mijn bestanden als Taal- en invoerinstellingen wijzigen Naam van apparaat wijzigen in Deze pagina vastzetten op het startscherm... @@ -5675,6 +5684,7 @@ Als je later besluit dat je Voice Match niet wilt gebruiken, verwijder je dit ge Externe beveiligingssleutel of ingebouwde sensor {NUM_EXTENSIONS,plural, =1{Een extensie is geweigerd}other{# extensies zijn geweigerd}} Upgrade voltooid +Kliksterkte Er ontbreekt een papierlade Schrijfbewerking overschrijdt de maximumlengte van het kenmerk voor: . Je hebt 1 opgeslagen printer. @@ -5956,6 +5966,7 @@ Als je later besluit dat je Voice Match niet wilt gebruiken, verwijder je dit ge Er is een fout opgetreden bij het upgraden van Linux. We herstellen de container via je back-up. x (beste) Plaats de beveiligingssleutel opnieuw en probeer het opnieuw. +Wijzig deze instelling in de adresbalk. Het apparaat waarmee je deelt, reageert niet. Probeer het opnieuw. Je beheerder heeft externe opslag uitgezet voor je account. Standaardachtergrond @@ -6803,6 +6814,7 @@ Bewaar je sleutelbestand op een veilige plaats. Je hebt het bestand nodig om nie Groep - - Dialoogvenster Verbinding Google Cloudprinter +Haptische feedback Afdrukken als afbeelding App-gegevens kunnen alle gegevens omvatten die een app heeft opgeslagen (op basis van de instellingen van de ontwikkelaar), waaronder gegevens zoals contacten, berichten en foto's. Back-upgegevens tellen niet mee voor het Drive-opslagquotum van je kind. @@ -7709,6 +7721,7 @@ Je kunt beheren wat je ziet in je herinneringen via phot download Dit proces kan enkele minuten duren. De virtuele machine wordt gedownload. Link openen op nieuw &tabblad +Je hebt de uitgebreide versie van Safe Browsing uitgezet in je account. Je organisatie heeft de Google Play Store niet aangezet voor jouw account. Neem contact op met je beheerder voor meer informatie. Sneller Gmail diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 09e107e1f1e8b6..cd2209e4566f95 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb @@ -2501,6 +2501,7 @@ Family Link ସହିତ ୱେବ୍‌ସାଇଟ୍ ପ୍ରତିବନ୍ଧତାଗୁଡ଼ିକ ଏବଂ ସ୍କ୍ରିନ୍‌ର ସମୟ ସୀମା ସେଟ୍ କରନ୍ତୁ ଡିଭାଇସ୍‌ରେ ନୀତି ଇନ୍‍ଷ୍ଟଲ୍‌ କରିବା ବିଫଳ ହୋ‍ଇଛି। ପାଖାପାଖି ବାକି ଅଛି +ସ୍କ୍ରିନକୁ ସ୍ପ୍ଲିଟ କରିବା ଏବଂ ଡେସ୍କଗୁଡ଼ିକୁ ସ୍ୱିଚ କରିବା ପରି କାର୍ଯ୍ୟଗୁଡ଼ିକ ପାଇଁ ଭାଇବ୍ରେସନ ମାଧ୍ୟମରେ ସୁନିଶ୍ଚିତକରଣ ପାଆନ୍ତୁ। &ବନାନ ଯାଞ୍ଚ ଏହି ପ୍ରକ୍ରିୟା ପାଇଁ ହୁଏତ କିଛି ସମୟ ଲାଗିପାରେ। Linux କଣ୍ଟେନର୍ ସେଟ୍ ଅପ୍ କରାଯାଉଛି। ଆପଣଙ୍କ ଫୋନରୁ ବର୍ତ୍ତମାନର Chrome ଟାବଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ @@ -4900,6 +4901,7 @@ ଆପଣଙ୍କର ଫୋନ୍ ଦେଖନ୍ତୁ Chrome ବ୍ରାଉଜର୍ ଏବଂ ଲଞ୍ଚର୍ ପାଇଁ ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ୍ ସେଟ୍ କରନ୍ତୁ ସ୍ମାର୍ଟ ଲକ୍ ବ୍ୟବହାର କରିବାକୁ, ଆପଣଙ୍କ ଫୋନ୍‍‍ରେ ପ୍ରାଥମିକ ଉପଯୋଗକର୍ତ୍ତା ପ୍ରୋଫାଇଲ୍‍କୁ ସ୍ୱିଚ୍ କରନ୍ତୁ +ଏହି ଲଗଗୁଡ଼ିକୁ "ମୋ ଫାଇଲଗୁଡ଼ିକ"ରେ ଏହି ଭାବେ ସେଭ କରାଯାଇଛି ଭାଷା ଓ ଇନ୍‌ପୁଟ୍ ସେଟିଂସ୍ ବଦଳାନ୍ତୁ ଡିଭାଇସର ନାମ ଦିଅନ୍ତୁ ସ୍କ୍ରିନ୍ ଆରମ୍ଭ କରିବା ପାଇଁ ଏହି ପୃଷ୍ଠାକୁ ପିନ୍ କରନ୍ତୁ... @@ -5678,6 +5680,7 @@ Voice Match ଆପଣଙ୍କ Assistantକୁ ଆପଣଙ୍କୁ ଚିହ ଏକ୍ସଟର୍ନଲ୍ ସୁରକ୍ଷା କୀ କିମ୍ବା ବିଲ୍ଟ-ଇନ୍ ସେନ୍ସର୍ {NUM_EXTENSIONS,plural, =1{ଏକ ଏକ୍ସଟେନସନ୍ ଅଗ୍ରାହ୍ୟ କରାଯାଇଛି}other{#ଟି ଏକ୍ସଟେନସନ୍ ଅଗ୍ରାହ୍ୟ କରାଯାଇଛି}} ଅପଗ୍ରେଡ୍ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି +କ୍ଲିକର କ୍ଷମତା ଏକ ପେପର୍ ଟ୍ରେ ଉପଲବ୍ଧ ନାହିଁ ଲେଖିବା କାର୍ଯ୍ୟ ବିଶେଷତାର ସର୍ବାଧିକ ଦୈର୍ଘ୍ୟରୁ ଅଧିକ ହୋଇଛି: ""। ଆପଣଙ୍କ ପାଖରେ 1ଟି ସେଭ୍ କରାଯାଇଥିବା ପ୍ରିଣ୍ଟର୍ ଅଛି। @@ -6805,6 +6808,7 @@ Voice Match ଆପଣଙ୍କ Assistantକୁ ଆପଣଙ୍କୁ ଚିହ ଗୋଷ୍ଠୀ - - ସଂଯୋଗ ସମ୍ବନ୍ଧିତ ଡାଏଲଗ୍ Google Cloud Print +ହାପ୍ଟିକ ମତାମତ ଛବି ଭାବରେ ପ୍ରିଣ୍ଟ କରନ୍ତୁ ଆପ୍ ଡାଟା, ଏପରି କୌଣସି ଡାଟା ହୋ‍ଇପାରେ ଯାହା କୌଣସି ଆପ୍ ଦ୍ଵାରା ସେଭ୍ ହୋ‍ଇଛି (ଡେଭଲପର୍‍ ସେଟିଂସ୍‍କୁ ଆଧାର କରି), ଏଥିରେ ଯୋଗାଯୋଗ, ମେସେଜ୍ ଓ ଫଟୋ ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି। ଆପଣଙ୍କ ପିଲାର ଡ୍ରାଇଭ୍ ଷ୍ଟୋରେଜ୍ କୋଟା ପାଇଁ ବ୍ୟାକ‍ଅପ୍ ଡାଟାକୁ ଗଣନା କରାଯିବ ନାହିଁ। diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 1d7ffa5d278c4a..f77911d7e71094 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb @@ -2518,6 +2518,7 @@ Family Link ਨਾਲ ਵੈੱਬਸਾਈਟ ਪਾਬੰਦੀਆਂ ਅਤੇ ਸਕ੍ਰੀਨ ਸਮੇਂ ਦੀਆਂ ਸੀਮਾਵਾਂ ਸੈੱਟ ਕਰੋ ਡੀਵਾਈਸ 'ਤੇ ਨੀਤੀ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ। ਲਗਭਗ ਬਾਕੀ +ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਅਤੇ ਸਵਿਚਿੰਗ ਡੈਸਕਾਂ ਵਰਗੀਆਂ ਕਾਰਵਾਈਆਂ ਲਈ ਥਰਥਰਾਹਟ ਤਸਦੀਕ ਪ੍ਰਾਪਤ ਕਰੋ। &ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਇਸ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ ਕੁਝ ਮਿੰਟ ਲੱਗ ਸਕਦੇ ਹਨ। Linux ਕੰਟੇਨਰ ਦਾ ਸੈੱਟਅੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਆਪਣੇ ਫ਼ੋਨ ਤੋਂ ਹਾਲੀਆ Chrome ਟੈਬਾਂ ਦੇਖੋ @@ -4918,6 +4919,7 @@ ਆਪਣੇ ਫ਼ੋਨ ਦੀ ਜਾਂਚ ਕਰੋ Chrome ਬ੍ਰਾਊਜ਼ਰ ਅਤੇ ਲਾਂਚਰ ਲਈ ਆਪਣੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਖੋਜ ਇੰਜਣ ਸੈੱਟ ਕਰੋ ਸਮਾਰਟ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਆਪਣੇ ਫ਼ੋਨ 'ਤੇ ਪ੍ਰਾਇਮਰੀ ਵਰਤੋਂਕਾਰ ਪ੍ਰੋਫਾਈਲ 'ਤੇ ਅਦਲਾ-ਬਦਲੀ ਕਰੋ +ਇਨ੍ਹਾਂ ਲੌਗਾਂ ਨੂੰ ਮੇਰੀਆਂ ਫ਼ਾਈਲਾਂ ਵਿੱਚ ਇਸ ਵਜੋਂ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ ਭਾਸ਼ਾ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਬਦਲੋ ਡੀਵਾਈਸ ਨੂੰ ਨਾਮ ਦਿਓ ਸਟਾਰਟ ਸਕ੍ਰੀਨ ਲਈ ਇਹ ਸਫ਼ਾ ਪਿਨ ਕਰੋ... @@ -5695,6 +5697,7 @@ ਬਾਹਰੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਜਾਂ ਬਿਲਟ-ਇਨ ਸੈਂਸਰ {NUM_EXTENSIONS,plural, =1{ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਗਿਆ}one{# ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਗਿਆ}other{# ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਗਿਆ}} ਅੱਪਗ੍ਰੇਡ ਪੂਰਾ ਹੋਇਆ +ਤਾਕਤ 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਪੇਪਰ ਟ੍ਰੇਅ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਲਿਖਣ ਦੀ ਕਿਰਿਆ ਇਸ 'ਤੇ ਐਟਰੀਬਿਊਟਾਂ ਦੀ ਅਧਿਕਤਮ ਲੰਬਾਈ ਤੋਂ ਅੱਗੇ ਵਧੀ: ""। ਤੁਹਾਡੇ ਕੋਲ ਰੱਖਿਅਤ ਕੀਤਾ 1 ਪ੍ਰਿੰਟਰ ਹੈ। @@ -6823,6 +6826,7 @@ ਗਰੁੱਪ - - ਕਨੈਕਸ਼ਨ ਵਿੰਡੋ Google Cloud Print +ਛੋਹ ਪ੍ਰਤੀਕਰਮ ਚਿੱਤਰ ਵਜੋਂ ਪ੍ਰਿੰਟ ਕਰੋ ਐਪ ਡਾਟਾ ਕਿਸੇ ਐਪ ਵੱਲੋਂ (ਵਿਕਾਸਕਾਰ ਸੈਟਿੰਗਾਂ 'ਤੇ ਅਧਾਰਿਤ) ਰੱਖਿਅਤ ਕੀਤਾ ਕੋਈ ਵੀ ਡਾਟਾ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਸੰਪਰਕਾਂ, ਸੁਨੇਹਿਆਂ ਅਤੇ ਫ਼ੋਟੋਆਂ ਵਰਗਾ ਡਾਟਾ ਸ਼ਾਮਲ ਹੈ। ਬੈਕਅੱਪ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ ਬੱਚੇ ਦੇ 'ਡਰਾਈਵ' ਸਟੋਰੇਜ ਕੋਟੇ ਵਿੱਚ ਨਹੀਂ ਗਿਣਿਆ ਜਾਵੇਗਾ। diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 16c66277b9289d..edf88f77b074cb 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb @@ -416,6 +416,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz • usunięcie plików cookie i innych tymczasowych danych witryn. Zakładki, historia i zapisane hasła pozostaną bez zmian. +Kod dostępu nie został rozpoznany Tak Aplikacja jest zablokowana Kliknij Spróbuj ponownie i zaakceptuj komunikat na komputerze @@ -582,6 +583,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Zapisz formę płatności Linux jest uaktualniany Dostępne +Bluetooth jest wyłączony. Włącz go, aby zobaczyć dostępne urządzenia. Aktualizacje zostały wyłączone przez administratora. Dostęp do backendu debugera stron Zastosuj @@ -1130,6 +1132,7 @@ Możesz zarządzać ustawieniami konta, korzystając z aplikacji Family Link na Przesyłaj kartę Edytuj zakładkę Szukaj urządzeń docelowych +Nie masz uprawnień do przesyłania na ten wyświetlacz Dodać „”? Wprowadzono nieprawidłowy indeks tabulacji. Dodaj drukarki do swojego profilu @@ -2500,6 +2503,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Ustaw ograniczenia dostępu do stron i czasu korzystania z urządzenia w Family Link Nie udało się zainstalować zasad na urządzeniu. Jeszcze około +Otrzymuj potwierdzenia wibracjami w przypadku czynności takich jak dzielenie ekranu lub przełączanie biurek. &Sprawdzanie pisowni Może to potrwać kilka minut. Konfiguruję kontener Linuxa. Wyświetlaj ostatnio przeglądane karty Chrome z telefonu @@ -2593,6 +2597,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Odczyt ustawień ułatwień dostępu {NUM_FILES,plural, =1{Ma stały dostęp do jednego pliku.}few{Ma stały dostęp do # plików.}many{Ma stały dostęp do # plików.}other{Ma stały dostęp do # pliku.}} Przyspieszenie TrackPointa +Zbyt wiele razy podano nieprawidłowy kod dostępu. Spróbuj ponownie później. Niezaufany Ikona rozszerzenia Przeglądarka Chrome wykryła, że niektóre z jej ustawień zostały zmodyfikowane przez inny program, i przywróciła im pierwotne wartości domyślne. @@ -2676,6 +2681,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Wpisz kod PIN, aby sparować z urządzeniem Aby usunąć aplikacje, otwórz Ustawienia > Sklep Google Play > Zarządzaj ustawieniami Androida > Aplikacje lub Menedżer aplikacji. Następnie kliknij aplikację, którą chcesz odinstalować (jeśli to konieczne, przesuń palcem w prawo lub w lewo, by ją znaleźć), a potem kliknij Odinstaluj lub Wyłącz. Podczas pisania pokazuj w tekście sugerowane wyrazy +Włączyć silniejsze zabezpieczenia? Zgłoś błąd Przeglądarka Chrome zapisała Twoje hasło na tym urządzeniu, ale jeśli wolisz, możesz je zamiast tego zapisać na swoim koncie Google. Jeśli to zrobisz, po zalogowaniu się będziesz mieć dostęp do wszystkich haseł z Twojego konta Google. Twoje dziecko musi unosić i opuszczać palec, aby można było zapisać odcisk @@ -3191,6 +3197,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Na tym urządzeniu nie możesz zainstalować więcej niż  profili eSIM. Aby dodać kolejny profil, najpierw usuń jeden z istniejących profili. Warunki korzystania z usługi Funkcja Smart Lock jest włączona +Wyłączyć silniejsze zabezpieczenia? Aktualizuj hasło Odepnij Podczas skanowania tego pliku w oprogramowaniu antywirusowym wystąpił nieoczekiwany błąd. @@ -4663,6 +4670,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Aplikacja wkrótce zostanie wstrzymana Produkt został uruchomiony z obrazu dysku. Zainstalowanie go na komputerze umożliwi uruchamianie bez użycia obrazu dysku i bieżące aktualizowanie. Automatycznie przesyła do Google statystyki użytkowania i raporty o awariach +Problemy z komunikacją sieciową Wyszukaj lub wpisz adres internetowy Rozumiem Zapisane hasła @@ -4898,6 +4906,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Sprawdź swój telefon Ustaw domyślną wyszukiwarkę dla Chrome i Menu z aplikacjami na urządzeniu Aby używać Smart Lock, przełącz telefon na profil głównego użytkownika +Te dzienniki zostały zapisane w Moich plikach jako Zmień język i ustawienia wprowadzania Nazwij urządzenie dla: Przypnij tę stronę do ekranu startowego... @@ -5674,6 +5683,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Zewnętrzny klucz bezpieczeństwa lub wbudowany czujnik {NUM_EXTENSIONS,plural, =1{Rozszerzenie zostało odrzucone}few{# rozszerzenia zostały odrzucone}many{# rozszerzeń zostało odrzuconych}other{# rozszerzenia zostało odrzucone}} Uaktualnianie zakończone +Siła kliknięcia Brakuje zasobnika na papier Przekroczenie maksymalnej długości atrybutu w operacji zapisu na: „”. Masz jedną zapisaną drukarkę. @@ -5955,6 +5965,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz Podczas uaktualniania Linuksa wystąpił błąd. Przywrócimy kontener z kopii zapasowej. x (najlepsza) Ponownie włóż klucz bezpieczeństwa i spróbuj jeszcze raz +Sprawdź to ustawienie w pasku adresu. Urządzenie, któremu udostępniasz plik, nie odpowiada. Spróbuj ponownie. Na Twoim koncie administrator wyłączył pamięć zewnętrzną. Domyślna tapeta @@ -6804,6 +6815,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia Grupa Okno połączenia Google Cloud Print +Reakcja na dotyk Drukuj jako grafikę Dane aplikacji obejmują wszystkie dane zapisane przez aplikację (zgodnie z ustawieniami dewelopera). Mogą to być między innymi kontakty, wiadomości i zdjęcia. Dane kopii zapasowej nie wliczają się do limitu miejsca na Dysku Twojego dziecka. @@ -7711,6 +7723,7 @@ Domena wymaga, by karta inteligentna pozostała w gnieźdz pobrane Może to potrwać kilka minut. Pobieram maszynę wirtualną. Otwórz link w nowej &karcie +Na swoim koncie wyłączyłeś(-aś) Ulepszone Bezpieczne przeglądanie. Twoja organizacja nie włączyła Sklepu Google Play dla Twojego konta. Aby uzyskać więcej informacji, skontaktuj się z administratorem. Szybciej Gmail diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index eba7d2be765851..8bd39025727001 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb @@ -417,6 +417,7 @@ • excluir cookies e outros dados temporários de sites. Os favoritos, o histórico e as senhas salvas não serão afetados. +O código de acesso não foi reconhecido Sim O app está bloqueado Clique em Tentar novamente e aceite a solicitação no seu computador @@ -584,6 +585,7 @@ Salvar forma de pagamento O Linux está sendo atualizado Disponível +O Bluetooth está desativado. Ative-o para ver os dispositivos disponíveis. As atualizações foram desativadas pelo seu administrador. Acessar back-end do depurador de página Aplicar @@ -1145,6 +1147,7 @@ Para gerenciar as configurações dessa conta, instale o app Family Link no seu Transmitir guia Editar favoritos Pesquisar destinos +Você não tem permissão para transmitir essa tela Adicionar ""? Índice de guias inválido inserido. Adicionar impressoras ao seu perfil @@ -2614,6 +2617,7 @@ e Ctrl + Alt + Diminuir brilho para diminuí-lo. Ler suas configurações de acessibilidade {NUM_FILES,plural, =1{Tem acesso permanente a um arquivo.}one{Tem acesso permanente a # arquivos.}other{Tem acesso permanente a # arquivos.}} Aceleração do TrackPoint +Você digitou um código de acesso incorreto muitas vezes. Tente novamente mais tarde Não confiáveis Ícone de extensão O Google Chrome detectou que algumas das suas configurações foram corrompidas por outro programa e as redefiniu para os padrões originais. @@ -2697,6 +2701,7 @@ e Ctrl + Alt + Diminuir brilho para diminuí-lo. Digite o PIN para parear com o dispositivo Para remover apps, acesse "Configurações" > "Google Play Store" > "Gerenciar preferências do Android" > "Apps" ou "Gerenciador de aplicativos". Depois, toque no app que você quer desinstalar (talvez seja necessário deslizar para a direita ou esquerda para encontrar o app). Em seguida, toque em "Desinstalar" ou "Desativar". Mostrar sugestões de escrita in-line enquanto você digita +Ativar a segurança aprimorada? Informar um bug O Chrome salvou sua senha neste dispositivo, mas ela pode ser salva na sua Conta do Google, se preferir. Assim, todas as senhas na sua conta ficarão disponíveis quando ela estiver conectada. Peça para a criança levantar o dedo algumas vezes para salvar a impressão digital @@ -3212,6 +3217,7 @@ e Ctrl + Alt + Diminuir brilho para diminuí-lo. Você pode instalar até perfis de eSIM no dispositivo. Para adicionar outro perfil, remova um existente. Termos de Serviço O Smart Lock está ativado +Desativar a segurança aprimorada? Atualizar senha Soltar O software antivírus falhou inesperadamente ao verificar este arquivo. @@ -4687,6 +4693,7 @@ Não exponha nenhuma informação confidencial. O app será pausado em breve Você está executando o a partir de uma imagem de disco. Instalá-lo no computador permite executá-lo sem a imagem de disco e garante que ele se manterá atualizado. Envia estatísticas de uso e relatórios de erros automaticamente para o Google +Problemas de comunicação com a rede Pesquisar ou digitar endereço da Web Ok, entendi Senhas salvas @@ -5981,6 +5988,7 @@ Não exponha nenhuma informação confidencial. Algo deu errado no upgrade do Linux. Faremos a restauração do contêiner usando seu backup. x (Melhor) Reinsira sua chave de segurança e tente novamente +Mude essa configuração na barra de endereço. O dispositivo com que você está compartilhando não respondeu. Tente novamente. Seu administrador desabilitou o armazenamento externo em sua conta. Plano de fundo padrão @@ -7737,6 +7745,7 @@ Mantenha a sua chave de arquivo em um local seguro. Você precisará dela para c download O processo pode levar alguns minutos. Fazendo o download da máquina virtual. Abrir link em uma nova &guia +Você desativou o Navegação segura com maior proteção na sua conta. Sua organização não ativou a Google Play Store para sua conta. Entre em contato com seu administrador para receber mais informações. Mais rápida Gmail diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 16dba6e4cbfed4..eb4c02d9b3d3df 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb @@ -2504,6 +2504,7 @@ С помощью Family Link вы можете ограничивать доступ к сайтам и время использования устройства. Не удалось применить политику к устройству. Осталось: +Виброотклик используется для подтверждения таких действий, как разделение экрана и переключение между рабочими столами. &Проверка правописания Выполняется настройка контейнера Linux. Это может занять несколько минут. Просматривайте последние вкладки, открытые на телефоне @@ -2619,7 +2620,7 @@ Устройство из , , клавиатура, уровень заряда батареи: % Произошла ошибка при записи файла: . Запись данных в файлы и каталоги, открытые в приложении -Выбрать другую версию +Выбрать другой канал Обновление не требуется Настройки перевода… Сообщает, если пароли были раскрыты в результате утечки данных. @@ -3196,7 +3197,7 @@ Условия использования Функция Smart Lock включена Обновить пароль -Открепить из Быстрого запуска +Открепить При сканировании этого файла произошел сбой антивирусного ПО. Программа чтения с экрана Выполняется подключение к профилю. Это может занять несколько минут. @@ -4558,7 +4559,7 @@ Высота звука Сохранить как PDF Срок действия -Нестабильная +Для разработчиков (нестабильная) Вс&тавить и перейти на страницу воспоминания из Google Фото Справочный &центр @@ -4903,6 +4904,7 @@ Проверьте телефон Выберите поисковую систему по умолчанию для браузера Chrome и панели запуска на устройстве . Чтобы использовать Smart Lock, включите основной профиль +Эти журналы сохранены в папке "Мои файлы" как Изменение настроек языка и метода ввода Присвоить название "" Прикрепить эту страницу к экрану запуска… @@ -5679,6 +5681,7 @@ Внешний электронный ключ или встроенный датчик {NUM_EXTENSIONS,plural, =1{Расширение отклонено}one{# расширение отклонено}few{# расширения отклонено}many{# расширений отклонено}other{# расширения отклонено}} Обновление завершено +Сила нажатия Отсутствует лоток для бумаги При записи данных на устройстве превышена максимальная длина атрибута. У вас 1 сохраненный принтер. @@ -6808,6 +6811,7 @@ Группа : , Диалоговое окно подключения Виртуальный принтер Google +Виброотклик Печатать как изображение Данные приложений – это любая информация, которую приложения сохраняют в соответствии с настройками разработчика. Она может включать контакты, сообщения, фотографии и многое другое. Данные резервных копий не занимают место в хранилище Google Диска. diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index dfafc2dad537f0..06d74dfce11c96 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb @@ -2521,6 +2521,7 @@ Domena zahteva, da je pametna kartica vstavljena.Nastavitev omejitev za obisk spletnih mest in omejitev časa uporabe s Family Linkom Namestitev pravilnika v napravi ni uspela. Še približno +Prejemanje potrditev z vibriranjem za dejanja, kot sta razdeljen zaslon in preklop med namizji. &Preverjanje črkovanja To lahko traja nekaj minut. Nastavljanje vsebnika za Linux. Oglejte si nedavne Chromove zavihke iz telefona. @@ -4923,6 +4924,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov. Preverite telefon Nastavite privzeti iskalnik za brskalnik Chrome in zaganjalnik naprave Če želite uporabljati Smart Lock, v telefonu preklopite na primarni uporabniški profil +Ti dnevniki so v Mojih datotekah shranjeni kot Spreminjanje nastavitev jezika in vnosa Poimenovanje naprave v Pripnite to stran na začetni zaslon ... @@ -5699,6 +5701,7 @@ Domena zahteva, da je pametna kartica vstavljena.Zunanji varnostni ključ ali vgrajeno tipalo {NUM_EXTENSIONS,plural, =1{Razširitev je zavrnjena}one{# razširitev je zavrnjena}two{# razširitvi sta zavrnjeni}few{# razširitve so zavrnjene}other{# razširitev je zavrnjenih}} Nadgradnja je končana +Moč klika Ni pladnja za papir Dejanje pisanja presega največjo dovoljeno dolžino atributa za to napravo: »«. Imate 1 shranjen tiskalnik. @@ -6829,6 +6832,7 @@ Datoteko s ključem shranite na varnem. Potrebovali jo boste za izdelavo novih r Skupina Pogovorno okno za povezovanje Google Tiskanje v oblaku +Povratne informacije s tresenjem Natisni kot sliko Podatki aplikacij so lahko kateri koli podatki, ki jih je shranila aplikacija (glede na nastavitve razvijalca), vključno s podatki, kot so stiki, sporočila in fotografije. Varnostno kopirani podatki se ne štejejo v otrokovo omejitev prostora za shranjevanje v Googlu Drive. diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 7e970da2b4a65a..459e1dbacdca2e 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb @@ -2500,6 +2500,7 @@ Për ndihmë lidhur me zgjidhjen e problemeve të transmetimit, drejtohu te Cakto kufizimet e sajteve të uebit dhe kufijtë për kohën para ekranit me Family Link Dështoi instalimi i politikës në pajisje. Mbeten rreth +Merr konfirmim me dridhje për veprimet si ekrani i ndarë dhe ndryshimi i tavolinave të punës. &Kontrolli drejtshkrimor Ky proces mund të zgjasë disa minuta. Kontejneri i Linux po konfigurohet. Vizito skedat e fundit të Chrome nga telefoni yt @@ -4899,6 +4900,7 @@ Mund të caktosh shumë çelësa për këtë veprim. Kontrollo telefonin Cakto motorin tënd të parazgjedhur të kërkimit për shfletuesin e Chrome dhe nisësin e Për të përdorur Smart Lock, kalo te profili parësor i përdoruesit në telefonin tënd +Këto evidenca janë ruajtur në "Skedarët e mi" si Ndrysho cilësimet e gjuhës dhe të hyrjes Emërtoje pajisjen në Gozhdoje këtë faqe tek ekrani i Nisjes... @@ -5675,6 +5677,7 @@ Mund të caktosh shumë çelësa për këtë veprim. Çelësi i jashtëm i sigurisë ose sensori i integruar {NUM_EXTENSIONS,plural, =1{Një shtesë është refuzuar}other{# shtesa janë refuzuar}} Përmirësimi përfundoi +Fortësia e klikimit Mungon një tabaka letre Veprimi i shkrimit e kalon gjatësinë maksimale të atributit te: "". Ke 1 printer të ruajtur. @@ -6802,6 +6805,7 @@ Mbaje skedarin e çelësit tënd në një vend të sigurt. Do të të duhet për Grupi - - Dialogu i lidhjes Printimi në renë kompjuterike i Google +Reagimi me prekje Printo si imazh Të dhënat e aplikacioneve mund të jenë çdo e dhënë që ka ruajtur një aplikacion (bazuar në cilësimet e zhvilluesit), duke përfshirë të dhëna si kontaktet, mesazhet dhe fotografitë. Të dhënat e rezervimit nuk do të llogariten në kuotën e hapësirës ruajtëse të "Diskut" të fëmijës tënd. diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 57226abc7c80ef..ab2c59f7b0f5e9 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb @@ -416,6 +416,7 @@ • brišete kolačiće i druge privremene podatke o sajtovima Ovo se neće odraziti na obeleživače, istoriju i sačuvane lozinke. +Ne prepoznajemo pristupni kôd Da Aplikacija je blokirana Kliknite na Probajte ponovo i potvrdno odgovorite na upit na računaru @@ -579,6 +580,7 @@ Sačuvajte način plaćanja Linux se nadograđuje Dostupno +Bluetooth je isključen. Da biste videli dostupne uređaje, uključite Bluetooth. Administrator je onemogućio ažuriranja. Pristup pozadinskom mehanizmu programa za otklanjanje grešaka na stranici Primeni @@ -1131,6 +1133,7 @@ Možete da upravljate podešavanjima ovog naloga ako instalirate aplikaciju Fami Prebacite karticu Izmenite obeleživač Pretražite odredišta +Nemate dozvolu za prebacivanje na ovaj ekran Želite li da dodate „“? Unet je nevažeći indeks kartice. Dodajte štampače na svoj profil @@ -2596,6 +2599,7 @@ a Ctrl+Alt+taster za smanjivanje osvetljenosti da biste umanjili prikaz.Čitanje podešavanja pristupačnosti {NUM_FILES,plural, =1{Ima stalan pristup jednoj datoteci.}one{Ima stalan pristup # datoteci.}few{Ima stalan pristup za # datoteke.}other{Ima stalan pristup za # datoteka.}} Ubrzanje TrackPoint-a +Previše puta ste uneli netačan pristupni kôd. Probajte ponovo kasnije. Nepouzdani Ikona dodatka Chrome je otkrio da je drugi program oštetio neka od podešavanja i resetovao ih je na prvobitne podrazumevane vrednosti. @@ -2679,6 +2683,7 @@ a Ctrl+Alt+taster za smanjivanje osvetljenosti da biste umanjili prikaz.Unesite PIN radi uparivanja sa uređajem Da biste uklonili aplikacije, idite u odeljak Podešavanja > Google Play prodavnica > Upravljajte Android podešavanjima > Aplikacije ili Menadžer aplikacija. Dodirnite aplikaciju koju želite da deinstalirate (možda ćete morati da prevučete nadesno ili nalevo da biste pronašli aplikaciju). Onda dodirnite Deinstaliraj ili Onemogući. Prikazuje predloge za pisanje u tekstu koji se pojavljuju dok kucate +Želite li da uključite poboljšanu bezbednost? Prijavite grešku Chrome je sačuvao lozinku na ovaj uređaj, ali možete umesto toga da je sačuvate na Google nalog. Tada će sve lozinke na Google nalogu takođe biti dostupne dok ste prijavljeni. Neka dete nastavi da podiže prst da bi otisak prsta bio sačuvan @@ -3194,6 +3199,7 @@ a Ctrl+Alt+taster za smanjivanje osvetljenosti da biste umanjili prikaz.Na ovom uređaju možete da instalirate najviše eSIM ppofila. Da biste dodali još jedan profil, uklonite postojeći. Uslovi korišćenja usluge Smart Lock je uključen +Želite li da isključite poboljšanu bezbednost? Ažuriraj lozinku Otkači Došlo je do neočekivane greške sa antivirusnim softverom pri skeniranju ove datoteke. @@ -4667,6 +4673,7 @@ Vodite računa da ne otkrijete nikakve osetljive informacije. će se uskoro pauzirati Pokrećete sa diska. Instalacija na računar omogućava pokretanje bez diska i redovno ažuriranje. Automatski šalje Google-u statistiku korišćenja i izveštaje o otkazivanju +Problemi sa komunikacijom preko mreže Pretražite ili unesite veb-adresu Važi Sačuvane lozinke @@ -5961,6 +5968,7 @@ Vodite računa da ne otkrijete nikakve osetljive informacije. Došlo je do greške pri nadogradnji Linux-a. Vratićemo kontejner pomoću rezervne kopije. x (Najbolje) Ponovo umetnite bezbednosni ključ i probajte ponovo +Promenite ovo podešavanje na traci za adresu. Uređaj sa kojim delite sadržaj nije odgovorio. Probajte ponovo. Žao nam je, administrator je onemogućio spoljnu memoriju na ovom nalogu. Podrazumevana pozadina @@ -7717,6 +7725,7 @@ Datoteka ključa: preuzimanje Ovo može da potraje par minuta. Preuzima se virtuelna mašina. Otvori link u novoj &kartici +Isključili ste poboljšano bezbedno pregledanje na nalogu. Organizacija nije omogućila Google Play prodavnicu za nalog. Kontaktirajte administratora za više informacija. Brže Gmail diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 02d583426d56df..8962fbf8f1108b 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb @@ -416,6 +416,7 @@ • бришете колачиће и друге привремене податке о сајтовима Ово се неће одразити на обележиваче, историју и сачуване лозинке. +Не препознајемо приступни кôд Да Апликација је блокирана Кликните на Пробајте поново и потврдно одговорите на упит на рачунару @@ -579,6 +580,7 @@ Сачувајте начин плаћања Linux се надограђује Доступно +Bluetooth је искључен. Да бисте видели доступне уређаје, укључите Bluetooth. Администратор је онемогућио ажурирања. Приступ позадинском механизму програма за отклањање грешака на страници Примени @@ -1131,6 +1133,7 @@ Пребаците картицу Измените обележивач Претражите одредишта +Немате дозволу за пребацивање на овај екран Желите ли да додате „“? Унет је неважећи индекс картице. Додајте штампаче на свој профил @@ -2596,6 +2599,7 @@ Читање подешавања приступачности {NUM_FILES,plural, =1{Има сталан приступ једној датотеци.}one{Има сталан приступ # датотеци.}few{Има сталан приступ за # датотеке.}other{Има сталан приступ за # датотека.}} Убрзање TrackPoint-а +Превише пута сте унели нетачан приступни кôд. Пробајте поново касније. Непоуздани Икона додатка Chrome је открио да је други програм оштетио нека од подешавања и ресетовао их је на првобитне подразумеване вредности. @@ -2679,6 +2683,7 @@ Унесите PIN ради упаривања са уређајем Да бисте уклонили апликације, идите у одељак Подешавања > Google Play продавница > Управљајте Android подешавањима > Апликације или Менаџер апликација. Додирните апликацију коју желите да деинсталирате (можда ћете морати да превучете надесно или налево да бисте пронашли апликацију). Онда додирните Деинсталирај или Онемогући. Приказује предлоге за писање у тексту који се појављују док куцате +Желите ли да укључите побољшану безбедност? Пријавите грешку Chrome је сачувао лозинку на овај уређај, али можете уместо тога да је сачувате на Google налог. Тада ће све лозинке на Google налогу такође бити доступне док сте пријављени. Нека дете настави да подиже прст да би отисак прста био сачуван @@ -3194,6 +3199,7 @@ На овом уређају можете да инсталирате највише eSIM пpофила. Да бисте додали још један профил, уклоните постојећи. Услови коришћења услуге Smart Lock је укључен +Желите ли да искључите побољшану безбедност? Ажурирај лозинку Откачи Дошло је до неочекиване грешке са антивирусним софтвером при скенирању ове датотеке. @@ -4667,6 +4673,7 @@ ће се ускоро паузирати Покрећете са диска. Инсталација на рачунар омогућава покретање без диска и редовно ажурирање. Аутоматски шаље Google-у статистику коришћења и извештаје о отказивању +Проблеми са комуникацијом преко мреже Претражите или унесите веб-адресу Важи Сачуване лозинке @@ -5961,6 +5968,7 @@ Дошло је до грешке при надоградњи Linux-а. Вратићемо контејнер помоћу резервне копије. x (Најбоље) Поново уметните безбедносни кључ и пробајте поново +Промените ово подешавање на траци за адресу. Уређај са којим делите садржај није одговорио. Пробајте поново. Жао нам је, администратор је онемогућио спољну меморију на овом налогу. Подразумевана позадина @@ -7717,6 +7725,7 @@ преузимање Ово може да потраје пар минута. Преузима се виртуелна машина. Отвори линк у новој &картици +Искључили сте побољшано безбедно прегледање на налогу. Организација није омогућила Google Play продавницу за налог. Контактирајте администратора за више информација. Брже Gmail diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 987b16b2d09273..52dad5fca14402 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb @@ -416,6 +416,7 @@ • ta bort cookies och tillfällig webbplatsdata. Bokmärken, historiken och sparade lösenord påverkas inte. +Åtkomstkoden känns inte igen Ja har blockerats Klicka på Försök igen och godkänn frågan på datorn @@ -583,6 +584,7 @@ Spara betalningsmetod Linux uppgraderas Tillgänglig +Bluetooth har inaktiverats. Aktivera Bluetooth om du vill se tillgängliga enheter. Uppdateringar har inaktiverats av administratören. Få åtkomst till serverdelen för felsökning av sida Verkställ @@ -1144,6 +1146,7 @@ Du kan hantera inställningarna för det här kontot genom att installera Family Casta fliken Redigera bokmärke Sök platser +Du har inte behörighet att casta till den här skärmen Vill du lägga till ? Du har angett ett ogiltigt flikindex. Lägg till skrivare i din profil @@ -2611,6 +2614,7 @@ och Ctrl + Alt + Minska ljusstyrka för att zooma ut. Läsa tillgänglighetsinställningarna {NUM_FILES,plural, =1{Den har permanent åtkomst till en fil.}other{Den har permanent åtkomst till # filer.}} TrackPoint-acceleration +Du har angett fel åtkomstkod för många gånger. Försök igen senare Opålitliga Tilläggsikon Chrome har upptäckt att visa av inställningarna har skadats av ett annat program och återställer dem till standardinställningarna. @@ -2694,6 +2698,7 @@ och Ctrl + Alt + Minska ljusstyrka för att zooma ut. Ange pinkod för att parkoppla med Om du vill ta bort appar öppnar du Inställningar > Google Play Butik > Hantera Android-inställningar > Appar eller Apphanteraren. Tryck sedan på appen du vill avinstallera (du kanske måste svepa åt höger eller vänster för att hitta appen). Tryck sedan på Avinstallera eller Inaktivera. Visa förslag som infogas medan du skriver +Vill du aktivera förbättrad säkerhet? Rapportera ett fel Chrome har sparat lösenordet på enheten, men du kan spara det i Google-kontot i stället. Alla lösenord som finns i Google-kontot är tillgängliga när du är inloggad. Låt ditt barn trycka och lyfta på fingret upprepade gånger så att fingeravtrycket sparas @@ -3209,6 +3214,7 @@ och Ctrl + Alt + Minska ljusstyrka för att zooma ut. Du kan installera högst eSIM-profiler på den här enheten. Om du vill lägga till en ny profil måste du först ta bort en av de gamla. Användarvillkor Smart Lock är aktiverat +Vill du inaktivera förbättrad säkerhet? Uppdatera lösenordet Lossa Ett oväntat fel uppstod i antivirusprogrammet när filen skulle genomsökas. @@ -4683,6 +4689,7 @@ Du kan tilldela flera brytare denna åtgärd. pausas snart Du kör från diskavbildningen. Om du installerar programmet på din dator kan du köra det utan diskavbildningen och du kan vara säker på att det alltid är uppdaterat. Skickar användningsstatistik och felrapporter till Google automatiskt +Problem med nätverkskommunikation Skriv en sökning eller en webbadress Ok, jag förstår Sparade lösenord @@ -5975,6 +5982,7 @@ Du kan tilldela flera brytare denna åtgärd. Det gick inte att uppgradera Linux. Vi återställer behållaren med hjälp av säkerhetskopian. x (bäst) Sätt i säkerhetsnyckeln en gång till och försök igen +Ändra inställningen i adressfältet. Enheten som du delar med svarade inte. Försök igen. Administratören har inaktiverat extern lagring för ditt konto. Standardbakgrund @@ -7729,6 +7737,7 @@ Spara nyckelfilen på ett säkert ställe. Den behövs om du ska skapa nya versi nedladdning Detta kan ta några minuter. Den virtuella maskinen laddas ned. Öppna länk i ny &flik +Du har inaktiverat Förbättrad säker webbsökning i kontot. Organisationen har inte aktiverat Google Play Butik för ditt konto. Kontakta administratören om du vill veta mer. Snabbare Gmail diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 49e6499a9e2637..f3026808f9a175 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb @@ -2518,6 +2518,7 @@ Family Link மூலம் இணையதளக் கட்டுப்பாடுகளையும் பயன்படுத்தும் நேர வரம்பையும் அமைக்கலாம் சாதனத்தில் கொள்கையை நிறுவ முடியவில்லை. சுமார் காத்திருங்கள் +திரைப் பிரிப்பு, டெஸ்க்குகளை மாற்றுதல் போன்ற செயல்களின்போது அதிர்வை உணரலாம். &எழுத்துப் பிழை சரிபார்ப்பான் இதற்குச் சில நிமிடங்கள் ஆகலாம். Linux கண்டெய்னரை அமைக்கிறது. சமீபத்திய Chrome தாவல்களை உங்கள் மொபைலில் இருந்தே பார்க்கலாம் @@ -4919,6 +4920,7 @@ மொபைலைப் பார்க்கவும் Chrome உலாவிக்கும் தொடக்கிக்கும் இயல்பான தேடல் இன்ஜினை அமைக்கலாம் Smart Lockகைப் பயன்படுத்த உங்கள் மொபைலில் உள்ள முதன்மைப் பயனர் கணக்கிற்கு மாறவும் +இந்தப் பதிவுகள் My Files ஃபோல்டரில் இவ்வாறு சேமிக்கப்பட்டுள்ளன: மொழி மற்றும் உள்ளீட்டு அமைப்புகளை மாற்றவும் எனச் சாதனத்திற்குப் பெயரிடும் தொடக்கத் திரையில் இந்தப் பக்கத்தைப் பொருத்து... @@ -5695,6 +5697,7 @@ இணைக்கக்கூடிய பாதுகாப்பு விசை அல்லது உள்ளமைந்த சென்சார் {NUM_EXTENSIONS,plural, =1{ஒரு நீட்டிப்பு நிராகரிக்கப்பட்டுள்ளது}other{# நீட்டிப்புகள் நிராகரிக்கப்பட்டுள்ளன}} மேம்படுத்துதல் நிறைவடைந்தது +கிளிக்கின் உணர்திறன் பேப்பர் வைக்கும் ட்ரே இல்லை எழுதுதல் செயல்பாடு இந்தச் சாதனத்திற்கான பண்புக்கூற்றின் அதிகபட்ச நீளத்தை மீறிவிட்டது: "". ஒரு பிரிண்டரை சேமித்துள்ளீர்கள். @@ -6825,6 +6828,7 @@ குழு - - இணைப்பு உரையாடல் Google Cloud Print +தொடுவதால் ஏற்படும் அதிர்வு படமாக அச்சிடு ஆப்ஸ் தரவு என்பது தொடர்புகள், மெசேஜ்கள், படங்கள் போன்றவை உள்ளிட்ட (டெவெலப்பர் அமைப்புகளைப் பொறுத்து) ஆப்ஸ் சேமித்த எந்தத் தரவாகவும் இருக்கலாம். உங்கள் பிள்ளையின் இயக்ககச் சேமிப்பக ஒதுக்கீட்டில் காப்புப் பிரதித் தரவு கணக்கிடப்படாது. diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 2762114a0ad959..b7548e2b11a39d 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb @@ -416,6 +416,7 @@ • కుక్కీలు, అలాగే తాత్కాలిక సైట్ డేటా తొలగించబడుతుంది బుక్‌మార్క్‌లు, హిస్టరీ, అలాగే సేవ్ చేయబడిన పాస్‌వర్డ్‌లు ప్రభావితం కావు. +యాక్సెస్ కోడ్ గుర్తించబడలేదు అవును బ్లాక్ చేయబడింది మళ్లీ ప్రయత్నించును క్లిక్ చేసి, మీ కంప్యూటర్‌లో ప్రాంప్ట్‌ను ఆమోదించండి @@ -583,6 +584,7 @@ చెల్లింపు పద్దతిని సేవ్ చేయండి Linux అప్‌గ్రేడ్ అవుతోంది అందుబాటులో ఉంది +బ్లూటూత్ ఆఫ్ చేయబడింది. అందుబాటులో ఉన్న పరికరాలను చూడటానికి, బ్లూటూత్‌ను ఆన్ చేయండి. అప్‌డేట్‌లను మీ నిర్వాహకులు నిలిపివేశారు. పేజీ డీబగ్గర్ బ్యాకెండ్‌ను యాక్సెస్ చేయండి వర్తించు @@ -1143,6 +1145,7 @@ ట్యాబ్‌ను ప్రసారం చేయండి బుక్‌మార్క్‌ను సవరించు గమ్యస్థానాలను వెతకండి +ఈ డిస్‌ప్లేలో ప్రసారం చేయడానికి మీకు అనుమతి లేదు ""ను జోడించాలా? చెల్లని టాబ్ సూచిక ఎంటర్ చేయ‌బడింది. మీ ప్రొఫైల్‌కు ప్రింటర్‌లను జోడించండి @@ -2611,6 +2614,7 @@ మీ యాక్సెస్‌ సెట్టింగ్‌లను చదవండి {NUM_FILES,plural, =1{ఇది ఒక ఫైల్‌కు శాశ్వత యాక్సెస్‌ను కలిగి ఉంది.}other{ఇది # ఫైళ్లకు శాశ్వత యాక్సెస్‌ను కలిగి ఉంది.}} ట్రాక్ పాయింట్ యాక్సిలరేషన్ +మీరు చాలా సార్లు తప్పు యాక్సెస్ కోడ్‌ను ఎంటర్ చేశారు. తర్వాత మళ్లీ ట్రై చేయండి అవిశ్వసనీయ ఎక్స్‌టెన్షన్ చిహ్నం మీ సెట్టింగ్‌లలో కొన్నింటిని మరో ప్రోగ్రామ్ మార్చినట్లుగా Chrome గుర్తించింది, తర్వాత వాటిని వాటి అసలు డిఫాల్ట్‌లకు రీసెట్ చేసింది. @@ -2694,6 +2698,7 @@ తో పెయిర్ చేయడానికి PINను ఎంటర్ చేయండి యాప్‌లను తీసివేయడం కోసం, సెట్టింగ్‌లు > Google Play Store > Android ప్రాధాన్యతలను నిర్వహించు > యాప్‌లు లేదా అప్లికేషన్ మేనేజర్‌లోకి వెళ్లండి. ఆపై, మీరు అన్ఇన్‌స్టాల్ చేయాలనుకుంటున్న యాప్‌ని నొక్కండి (మీరు యాప్‌ని కనుగొనడం కోసం ఎడమ లేదా కుడి వైపునకు స్వైప్ చేయాల్సి రావచ్చు). ఆపై, అన్ఇన్‌స్టాల్ చేయి లేదా నిలిపివేయిని ఎంచుకోండి. మీరు టైప్ చేస్తున్నప్పుడు కనిపించే ఇన్‌లైన్ వ్రాత సూచనలను చూడండి +మెరుగుపరచబడిన సెక్యూరిటీని ఆన్ చేయాలా? ఒక బగ్‌ను రిపోర్ట్ చేయండి Chrome మీ పాస్‌వర్డ్‌ను ఈ పరికరంలో సేవ్ చేసింది, బదులుగా మీరు దానిని మీ Google ఖాతాలో సేవ్ చేసుకోవచ్చు. మీరు సైన్ ఇన్ చేసినప్పుడు మీ Google ఖాతాలోని అన్ని పాస్‌వర్డ్‌లు అందుబాటులో ఉంటాయి. వేలిముద్రను సేవ్ చేయడానికి మీ చిన్నారి వారి వేలును పైకి ఎత్తుతూ ఉండేలా చేయండి @@ -3209,6 +3214,7 @@ మీరు ఈ పరికరంలో eSIM ప్రొఫైల్‌ల వరకు ఇన్‌స్టాల్ చేయవచ్చు. మరొక ప్రొఫైల్‌ను జోడించడానికి, మొదట ఇప్పటికే ఉన్న ప్రొఫైల్‌ను తీసివేయండి. సర్వీస్ నియమాలు Smart Lock ఆన్‌లో ఉంది +మెరుగుపరచబడిన సెక్యూరిటీని ఆఫ్ చేయాలా? పాస్‌వర్డ్‌ను అప్‌డేట్ చేయి అన్‌పిన్ చేయి ఈ ఫైల్‌ను స్కాన్ చేస్తున్నప్పుడు ఊహించని విధంగా యాంటీ-వైరస్ సాఫ్ట్‌వేర్ విఫలమైంది. @@ -4683,6 +4689,7 @@ త్వరలో పాజ్ అవుతుంది మీరు డిస్క్ ఇమేజ్ నుండి దాన్ని అమలు చేస్తున్నారు. మీ కంప్యూటర్‌లో దీన్ని ఇన్‌స్టాల్ చేయడం వలన డిస్క్ ఇమేజ్ లేకుండా దాన్ని అమలు చేయడానికి మీరు అనుమతించబడతారు. ఇది తాజాగా ఉంటుందని హామీ పొందుతారు. వినియోగ గణాంకాలను, క్రాష్ రిపోర్ట్‌లను ఆటోమేటిక్‌గా Googleకు పంపుతుంది +నెట్‌వర్క్ కమ్యూనికేషన్ సమస్యలు వెతకండి లేదా వెబ్ అడ్రస్‌ టైప్ చేయండి సరే, అర్థమైంది సేవ్ చేసిన పాస్‌వర్డ్‌లు @@ -5977,6 +5984,7 @@ Linuxని అప్‌గ్రేడ్ చేయడంలో ఎర్రర్ ఎదురైంది. మేము మీ బ్యాకప్ ఉపయోగించి కంటైనర్‌ను రీస్టోర్ చేస్తాము. x (ఉత్తమం) మీ సెక్యూరిటీ కీని తీసివేసి, మళ్లీ ఇన్‌సర్ట్ చేసి, ఆపై మరొకసారి ప్రయత్నించండి +అడ్రస్ బార్‌లో ఈ సెట్టింగ్‌ను మార్చండి. మీరు షేర్ చేస్తున్న పరికరం స్పందించడం లేదు. దయచేసి మళ్లీ ట్రై చేయండి. క్షమించండి, మీ నిర్వాహకుడు మీ ఖాతాలో బాహ్య నిల్వను నిలిపివేశారు. డిఫాల్ట్ వాల్‌పేపర్ @@ -7728,6 +7736,7 @@ డౌన్‌లోడ్ ఈ ప్రాసెస్‌కు కొన్ని నిమిషాలు పట్టవచ్చు. మర్చువల్ మెషీన్ డౌన్‌లోడ్ అవుతోంది. లింక్‌ను కొత్త &టాబ్‌లో తెరువు +మీరు మీ ఖాతాలో మెరుగైన సురక్షిత బ్రౌజింగ్‌ను ఆఫ్ చేశారు. మీ సంస్థ మీ ఖాతా కోసం Google Play Storeను ప్రారంభించలేదు. మరింత సమాచారం కోసం మీ నిర్వాహకులను సంప్రదించండి. చాలా వేగంగా Gmail diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 493fe5dd462e05..b89f50d7b72005 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb @@ -2521,6 +2521,7 @@ Установіть обмеження для веб-сайтів і часу використання пристрою в додатку Family Link Не вдалося встановити політику на пристрій. Залишилося приблизно +Отримуйте вібропідтвердження для різних дій, наприклад розділення екрана й переходу між робочими столами. &Перевірка орфографії Це може тривати кілька хвилин. Налаштовується контейнер Linux. Переглядайте останні вкладки Chrome із телефона @@ -4921,6 +4922,7 @@ Перевірте телефон Налаштуйте пошукову систему за умовчанням для веб-переглядача Chrome і Панелі запуску Щоб користуватися Smart Lock, перейдіть у профіль основного користувача на телефоні +Ці журнали збережено в папці "Мої файли" як Змінити налаштування мови та введення Зберегти назву "" Закріпити цю сторінку на екрані запуску... @@ -5697,6 +5699,7 @@ Внутрішній ключ безпеки або вбудований датчик {NUM_EXTENSIONS,plural, =1{Розширення відхилено}one{# розширення відхилено}few{# розширення відхилено}many{# розширень відхилено}other{# розширення відхилено}} Оновлення завершено +Сила натиску Немає лотка для паперу Операція внесення змін перевищує максимальну довжину атрибута пристрою . У вас є 1 збережений принтер. @@ -6827,6 +6830,7 @@ Група - - Діалогове вікно з’єднання Google Cloud Print +Вібровідгук Друкувати як зображення Дані додатків – це будь-яка інформація, яку вони зберігають (залежно від налаштувань розробника), зокрема контакти, повідомлення та фотографії. Резервні копії даних не займають місця на Диску дитини. diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index f9963ba2dba50f..b1d674e06f3264 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb @@ -2518,6 +2518,7 @@ và Ctrl+Alt+Giảm độ sáng để thu nhỏ. Đặt các hạn chế về trang web và giới hạn thời gian sử dụng thiết bị bằng Family Link Không cài đặt được chính sách trên thiết bị. Còn khoảng +Nhận thông báo rung để xác nhận cho những thao tác như chia đôi màn hình và chuyển đổi không gian làm việc. &Kiểm tra chính tả Quá trình này có thể mất vài phút. Đang thiết lập vùng chứa Linux. Xem các thẻ Chrome mở gần đây trên điện thoại @@ -4918,6 +4919,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này. Kiểm tra điện thoại của bạn Thiết lập công cụ tìm kiếm mặc định cho trình duyệt Chrome và Trình chạy trên Để sử dụng Smart Lock, hãy chuyển sang hồ sơ người dùng chính trên điện thoại của bạn +Các bản ghi nhật ký này đã được lưu vào Tệp của tôi dưới dạng Thay đổi cài đặt ngôn ngữ và phương thức nhập Đặt tên cho thiết bị Ghim trang này vào màn hình Bắt đầu... @@ -5694,6 +5696,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này. Khóa bảo mật bên ngoài hoặc cảm biến tích hợp {NUM_EXTENSIONS,plural, =1{1 tiện ích đã bị từ chối}other{# tiện ích đã bị từ chối}} Đã nâng cấp xong +Độ mạnh của thao tác nhấp Thiếu một khay giấy Tác vụ ghi vượt quá độ dài tối đa của thuộc tính cho: "". Bạn đã lưu 1 máy in. @@ -6824,6 +6827,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ Nhóm Hộp thoại kết nối Google Cloud Print +Phản hồi xúc giác In dưới dạng hình ảnh Dữ liệu ứng dụng có thể là bất kỳ dữ liệu nào mà một ứng dụng đã lưu (dựa trên tùy chọn cài đặt của nhà phát triển), bao gồm cả dữ liệu như danh bạ, tin nhắn và ảnh. Dữ liệu sao lưu sẽ không tính vào hạn mức bộ nhớ Drive của con bạn. diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 749eee53f6e2cc..b4e05f3ac5998d 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb @@ -2517,7 +2517,7 @@ 透過 Family Link 設定網站限制和裝置使用時間限制 無法在裝置上安裝政策。 大約剩餘 -接收相關操作 (如分割畫面和切換桌面等) 的震動確認。 +接收相關操作 (例如分割螢幕和切換桌面等) 的震動確認。 拼字檢查(&S) 此程序可能需時幾分鐘。正在設定 Linux 容器。 查看最近透過手機開啟的 Chrome 分頁 @@ -4919,7 +4919,7 @@ 請檢查手機 設定 Chrome 瀏覽器和 啟動器的預設搜尋引擎 如要使用 Smart Lock,請在手機上切換至主要使用者設定檔 -這些記錄已儲存至「我的檔案」,檔名為 +這些記錄已儲存至「我的檔案」,名為 變更語言和輸入設定 將裝置個名改做 將這個網頁固定到 [開始] 螢幕… @@ -5696,7 +5696,7 @@ 外置安全密鑰或內置感應器 {NUM_EXTENSIONS,plural, =1{已拒絕 1 個擴充程式}other{已拒絕 # 個擴充程式}} 升級完成 -點按強度 +點擊力度 找不到紙匣 寫入操作長度超過「」屬性的上限。 你有 1 部儲存咗嘅打印機。 @@ -6827,7 +6827,7 @@ 群組 - - 連線對話框 Google 雲端列印 -觸動回饋 +觸感反應 以圖片形式列印 應用程式資料泛指應用程式根據開發人員設定所儲存的任何資料,包括聯絡人、訊息和相片等資料。 備份資料將不會佔用您子女的「雲端硬碟」儲存空間配額。 diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index 7011346c3b84e5..5e8259a4e0df8e 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb @@ -250,6 +250,7 @@ Google Chrome kan nie jou instellings terugstel nie. Jy was as by Chrome aangemeld. Gebruik asseblief dieselfde rekening om weer aan te meld. Chrome-bedryfstelsel se bepalings Chrome-bedryfstelsel kon nie jou data sinkroniseer nie, omdat sinkronisering nie vir jou domein beskikbaar is nie. +Kry Chrome se sterkste beskerming Chrome sal by jou Drive ingaan om voorstelle in die adresbalk te maak Google Chrome Dev Gaan na Chrome OS-instellings om te sien of jou toestel op datum is @@ -308,6 +309,7 @@ Google Chrome kan nie jou instellings terugstel nie. Jy het nie die gepaste regte vir stelselvlak-installering nie. Probeer om die installeerder weer te laat loop as Administrateur. Herbegin Chrome Meld op albei toestelle by Chrome aan om 'n nommer van af na jou Android-foon te stuur. +Pasmaak die privaatheidkeuses wat Chrome as die belangrikste beskou. Hierdie gids sluit nie elke instelling en opsie in nie. Jy voeg tans 'n werkprofiel by hierdie blaaier en gee jou administrateur beheer oor net jou werkprofiel. {0,plural, =0{'n Chrome-opdatering is beskikbaar}=1{'n Chrome-opdatering is beskikbaar}other{'n Chrome-opdatering is al # dae lank beskikbaar}} Chrome-bedrystelsel kon nie jou data sinkroniseer nie, omdat jou rekening se aanmeldbesonderhede verouderd is. diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index 907e9c23a07008..494e38aada83c8 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb @@ -305,6 +305,7 @@ Bəzi funksiyalar əlçatmaz ola bilər. Xüsusi profil direktoriyası göstəri Chrome'u yenidən başladın cihazından Android telefonunuza nömrə göndərmək üçün hər iki cihazda Chrome'a daxil olun. Chrome'un ən vacib hesab etdiyi məxfilik seçimlərini fərdiləşdirin. Bu bələdçiyə hər ayar və seçim daxil deyil. +Hesabınızda Qabaqcıl Güvənli Baxışı aktiv etdiniz. İndi onu Chrome üçün əldə edin. Bu brauzerə iş profili əlavə edirsiniz və administratorunuza yalnız iş profili üzərində nəzarət verirsiniz. {0,plural, =0{Chrome güncəlləməsi əlçatandır}=1{Chrome güncəlləməsi əlçatandır}other{Chrome güncəlləməsi # gün əlçatan olub}} Chrome OS datanızı sinxronizasiya edə bilmir, çünki hesaba giriş məlumatlarınız köhnədir. diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 4ebedceaf92f2e..5e3f4680cd696e 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb @@ -249,6 +249,7 @@ Раней вы ўваходзілі ў Chrome як . Для паўторнага ўваходу скарыстайце той жа ўліковы запіс. Умовы выкарыстання Chrome OS Chrome OS не ўдалося сінхранізаваць даныя, бо гэта функцыя недаступная для вашага дамена. +Засцеражыце браўзер Chrome ад небяспек Каб выводзіць прапановы ў адрасным радку, браўзер Chrome будзе карыстацца доступам да вашага Дыска Google Chrome для распрацоўшчыкаў Каб даведацца, ці абноўлена прылада, адкрыйце Налады Chrome OS @@ -307,6 +308,7 @@ Для ўсталявання на сістэмным узроўні ў вас няма неабходных правоў. Паспрабуйце запусціць усталёўшчык ад імені адміністратара. Перазапусціць Chrome Каб адпраўляць нумары з на свой тэлефон Android, увайдзіце ў Chrome на абедзвюх прыладах. +Наладзьце найбольш важныя параметры прыватнасці браўзера Chrome. У гэтым дапаможніку ўказаны не ўсе налады і параметры. Вы дадаяце працоўны профіль у гэты браўзер і даяце адміністратару кантроль толькі над працоўным профілем. {0,plural, =0{Ёсць абнаўленне Chrome}=1{Ёсць абнаўленне Chrome}one{Абнаўленне Chrome выйшла ўжо # дзень таму}few{Абнаўленне Chrome выйшла # дні таму}many{Абнаўленне Chrome выйшла # дзён таму}other{Абнаўленне Chrome выйшла # дня таму}} Сінхранізаваць даныя ў сістэме Chrome OS не ўдалося: даныя ўліковага запісу для ўваходу састарэлі. diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 55047e595a822e..871f03095b771d 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb @@ -308,6 +308,7 @@ Moguće je da neke funkcije neće biti dostupne. Odredite drugi direktorij profi Ponovo pokreni Chrome Da pošaljete broj s uređaja na svoj Android telefon, prijavite se u Chrome na oba uređaja. Prilagodite odabire privatnosti koje Chrome smatra najvažnijim. Ovaj vodič ne obuhvata svaku postavku i opciju. +Uključili ste poboljšano sigurno pregledavanje na svom računu. Sada ga preuzmite za Chrome. Dodajete radni profil na ovaj preglednik i dajte administratoru kontrolu samo nad radnim profilom. {0,plural, =0{Dostupno je ažuriranje Chromea}=1{Dostupno je ažuriranje Chromea}one{Ažuriranje Chromea je dostupno # dan}few{Ažuriranje Chromea je dostupno # dana}other{Ažuriranje Chromea je dostupno # dana}} Chrome OS nije mogao sinhronizirati vaše podatke jer su podaci o prijavi računa zastarjeli. diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 3f4df0097e2153..2f8f5b42d719f4 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb @@ -249,6 +249,7 @@ Aplikace Google Chrome nemůže vaše nastavení obnovit. K prohlížeči Chrome jste byli přihlášeni pomocí účtu . Přihlaste se prosím znovu pomocí stejného účtu. Smluvní podmínky systému Chrome OS Chrome OS nemohl synchronizovat vaše data, protože Synchronizace ve vaší doméně není k dispozici. +Aktivujte si v Chromu maximální zabezpečení Chrome bude za účelem zobrazování návrhů v adresním řádku číst váš obsah na Disku Google Chrome Dev Chcete-li se podívat, zda je zařízení aktualizované, přejděte do Nastavení operačního systému Chrome @@ -307,6 +308,7 @@ Aplikace Google Chrome nemůže vaše nastavení obnovit. Nemáte práva nutná k provádění instalací na úrovni systému. Zkuste spustit instalační program jako správce. Znovu spustit Chrome Chcete-li poslat číslo z webu na svůj telefon Android, v obou zařízeních se přihlaste do Chromu. +Přizpůsobte si nastavení ochrany soukromí, která jsou v prohlížeči Chrome nejdůležitější. Tento průvodce nezahrnuje všechna nastavení a možnosti. Přidáváte do tohoto prohlížeče pracovní profil a povolujete administrátorovi ovládat pouze pracovní profil. {0,plural, =0{Je k dispozici aktualizace Chromu}=1{Je k dispozici aktualizace Chromu}few{Již # dny je k dispozici aktualizace Chromu}many{Již # dne je k dispozici aktualizace Chromu}other{Již # dní je k dispozici aktualizace Chromu}} Chrome OS vaše data nemohl synchronizovat, protože vaše přihlašovací údaje nejsou aktuální. diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 125dcbcc222d81..4abb497cb6005e 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb @@ -242,6 +242,7 @@ Du loggede ind i Chrome som . Brug den samme konto til at logge ind igen. Vilkår for Chrome OS Chrome OS kunne ikke synkronisere dine data, fordi synkronisering ikke er tilgængelig for dit domæne. +Få Chromes stærkeste beskyttelse Chrome har adgang til Drev, så der kan vises forslag i adresselinjen Udviklerversionen af Chrome Du kan se, om en enhed er opdateret, ved at gå til indstillingerne for Chrome OS @@ -300,6 +301,7 @@ Du har ikke de nødvendige rettigheder til en installation på systemniveau. Prøv at køre installationsprogrammet igen som administrator. Genstart Chrome Hvis du vil sende et nummer fra til din Android-telefon, skal du logge ind på Chrome på begge enheder. +Tilpas de privatlivsindstillinger, som Chrome anser for at være de vigtigste. Denne vejledning gennemgår ikke alle indstillinger og valgmuligheder. Du er ved at føje en arbejdsprofil til denne browser, og du giver kun din administrator kontrol over arbejdsprofilen. {0,plural, =0{Der er en tilgængelig Chrome-opdatering}=1{Der er en tilgængelig Chrome-opdatering}one{En Chrome-opdatering har været tilgængelig i # dag}other{En Chrome-opdatering har været tilgængelig i # dage}} Chrome OS kunne ikke synkronisere dine data, fordi loginoplysningerne til din konto er forældede. diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index 59cae76ba11b28..d3e2bd962f5f05 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb @@ -241,6 +241,7 @@ Sie waren in Chrome als angemeldet. Melden Sie sich bitte wieder mit demselben Konto an. Chrome OS-Nutzungsbedingungen Chrome OS konnte Ihre Daten nicht synchronisieren, da die Synchronisierung für Ihre Domain nicht verfügbar ist. +Höchste Sicherheit in Chrome erhalten Chrome greift auf Google Drive zu, um in der Adressleiste Vorschläge zu machen Google Chrome Dev Sie können anhand der Einstellungen von Chrome OS sehen, ob Ihr Gerät auf dem neuesten Stand ist @@ -299,6 +300,7 @@ Sie verfügen nicht über die erforderlichen Rechte für eine systemweite Installation. Starten Sie das Installationsprogramm als Administrator. Chrome neu starten Wenn Sie eine Nummer von an Ihr Android-Smartphone senden möchten, müssen Sie sich auf beiden Geräten in Chrome anmelden. +Sie können die wichtigsten Datenschutzeinstellungen von Chrome anpassen. In dieser Anleitung werden nicht alle Einstellungen und Optionen behandelt. Sie fügen diesem Browser ein Arbeitsprofil hinzu und erteilen Ihrem Administrator nur Rechte für das Arbeitsprofil. {0,plural, =0{Ein Chrome-Update ist verfügbar}=1{Ein Chrome-Update ist verfügbar}other{Ein Chrome-Update ist seit # Tagen verfügbar}} Chrome OS konnte Ihre Daten nicht synchronisieren, da die Anmeldedaten Ihres Kontos veraltet sind. diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 512bc790a02800..ddad42aa38177b 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb @@ -306,6 +306,7 @@ Επανεκκίνηση του Chrome Για να στείλετε έναν αριθμό από το στο τηλέφωνό σας Android, συνδεθείτε στο Chrome και στις δύο συσκευές. Προσαρμογή των επιλογών απορρήτου που το Chrome θεωρεί πιο σημαντικές. Αυτός ο οδηγός δεν περιλαμβάνει όλες τις ρυθμίσεις και επιλογές. +Ενεργοποιήσατε τη Βελτιωμένη Ασφαλή περιήγηση στον λογαριασμό σας. Τώρα, αποκτήστε τη για το Chrome. Προσθέτετε ένα προφίλ εργασίας σε αυτό το πρόγραμμα περιήγησης και παραχωρείτε τον έλεγχο στον διαχειριστή σας μόνο για το προφίλ εργασίας. {0,plural, =0{Υπάρχει μια διαθέσιμη ενημέρωση του Chrome}=1{Υπάρχει μια διαθέσιμη ενημέρωση του Chrome}other{Υπάρχει μια διαθέσιμη ενημέρωση του Chrome για # ημέρες}} Το Chrome OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας, επειδή τα στοιχεία σύνδεσης στο λογαριασμό σας δεν είναι ενημερωμένα. diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 1a3603cc4ed01d..bfd2845d5fe48c 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb @@ -309,6 +309,7 @@ Google Chrome is unable to recover your settings. Relaunch Chrome To send a number from to your Android phone, sign in to Chrome on both devices. Customise the privacy choices that Chrome considers most important. This guide doesn't include every setting and option. +You turned on Enhanced Safe Browsing in your account. Now get it for Chrome. You are adding a work profile to this browser and giving your administrator control over just the work profile. {0,plural, =0{A Chrome update is available}=1{A Chrome update is available}other{A Chrome update has been available for # days}} Chrome OS could not sync your data because your account sign-in details are out of date. diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 36ad533ff5bdf7..12a9ef3522b60e 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb @@ -242,6 +242,7 @@ Accediste a Google Chrome con . Usa la misma cuenta para volver a acceder. Condiciones del Chrome OS El Chrome OS no pudo sincronizar los datos porque la sincronización no está disponible para el dominio. +Obtén la seguridad más sólida de Chrome Chrome accederá a tus datos de Drive para hacer sugerencias en la barra de direcciones Google Chrome Dev Para saber si tu dispositivo está actualizado, ve a la configuración del Sistema operativo Chrome @@ -300,6 +301,7 @@ No tienes los derechos que se requieren para realizar la instalación al nivel del sistema. Intenta ejecutar el instalador nuevamente como Administrador. Volver a iniciar Chrome Para enviar un número de a tu teléfono Android, accede a Chrome en ambos dispositivos. +Personaliza las opciones de privacidad más importantes de Chrome. Esta guía no incluye todas las opciones ni los parámetros de configuración. Estás agregando un perfil de trabajo a este navegador y dándole a tu administrador el control únicamente del perfil de trabajo. {0,plural, =0{Hay una actualización de Chrome disponible}=1{Hay una actualización de Chrome disponible}other{Hay una actualización de Chrome disponible hace # días}} El Chrome OS no pudo sincronizar los datos porque la información de acceso de la cuenta está desactualizada. diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index f280e26dccc4b5..290cbdd083b032 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb @@ -250,6 +250,7 @@ Google Chrome no puede recuperar tu configuración. Habías iniciado sesión en Chrome como . Utiliza la misma cuenta para volver a iniciar sesión. Condiciones de Chrome OS Chrome OS no ha podido sincronizar los datos porque la función de sincronización no está disponible para tu dominio. +Consigue la seguridad más potente de Chrome Chrome accederá a tu Drive para mostrarte sugerencias en la barra de direcciones Google Chrome Dev Para comprobar si tu dispositivo está actualizado, ve a la configuración de Chrome OS @@ -308,6 +309,7 @@ Google Chrome no puede recuperar tu configuración. No dispones de los derechos necesarios para la instalación en el sistema. Intenta ejecutar de nuevo el programa de instalación como administrador. Volver a iniciar Chrome Para enviar un número desde a tu teléfono Android, inicia sesión en Chrome con ambos dispositivos. +Personaliza las opciones de privacidad que Chrome considera más importantes. En esta guía, no se incluyen todos los ajustes y opciones. Vas a añadir un perfil de trabajo a este navegador y le vas a dar a tu administrador el control únicamente sobre este perfil. {0,plural, =0{Hay una actualización de Chrome disponible}=1{Hay una actualización de Chrome disponible}other{Hay una actualización de Chrome disponible desde hace # días}} Chrome OS no ha podido sincronizar los datos porque la información de inicio de sesión de tu cuenta está obsoleta. diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index 6343ecf29a5d1a..9a45d784fae947 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb @@ -245,6 +245,7 @@ Mõned funktsioonid ei pruugi saadaval olla. Määrake muu profiilikataloog või Olite Chrome'i sisse logitud kasutajana . Kasutage uuesti sisselogimiseks sama kontot. Chrome OS-i tingimused Google OS ei saanud teie andmeid sünkroonida, sest sünkroonimine pole teie domeenil saadaval. +Hankige Chrome'i parimad turbefunktsioonid Chrome pääseb teie Drive'ile juurde, et aadressiribal soovitusi anda Google Chrome Dev Kui soovite teada saada, kas teie seade on ajakohane, avage Chromium OS-i seaded @@ -303,6 +304,7 @@ Mõned funktsioonid ei pruugi saadaval olla. Määrake muu profiilikataloog või Teil ei ole süsteemi tasemel installimiseks sobivaid õigusi. Proovige installijat administraatorina uuesti käivitada. Käivita Chrome uuesti Numbri saatmiseks asukohast Android-telefoni logige mõlemas seadmes Chrome'i sisse. +Kohandage privaatsusvalikuid, mida Chrome peab kõige olulisemaks. See juhend ei hõlma igat seadet ja valikut. Lisate sellesse brauserisse tööprofiili ja annate administraatorile kontrolli vaid oma tööprofiili üle. {0,plural, =0{Chrome'i värskendus on saadaval}=1{Chrome'i värskendus on saadaval}other{Chrome'i värskendus on # päeva saadaval olnud}} Chrome OS ei saanud andmeid sünkroonida, sest teie konto sisselogimisandmed on aegunud. diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 8c60763b8253e7..e5d543693568a6 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb @@ -242,6 +242,7 @@ Chromeen kirjautunut käyttäjä: . Kirjaudu uudelleen sisään samalla tilillä. Chrome-käyttöjärjestelmän käyttöehdot Chrome-käyttöjärjestelmä ei voinut synkronoida tietoja, koska synkronointi ei ole käytettävissä verkkotunnuksessasi. +Ota Chromen tehokkain suojaus käyttöön Chrome käyttää Drivea antaakseen ehdotuksia osoitepalkissa Google Chromen kehittäjäversio Tarkista Chrome-käyttöjärjestelmän asetuksista, onko laitteesi ajan tasalla @@ -300,6 +301,7 @@ Sinulla ei ole käyttöoikeuksia järjestelmätason asennukseen. Kokeile asennusohjelman suorittamista uudelleen järjestelmänvalvojana. Käynnistä Chrome uudelleen Jos haluat lähettää numeron osoitteesta Android-puhelimeesi, kirjaudu Chromeen molemmilla laitteilla. +Muuta yksityisyysvalintoja, jotka ovat Chromen mukaan kaikista tärkeimpiä. Tässä oppaassa ei ole ohjeita jokaisesta asetuksesta tai vaihtoehdosta. Olet lisäämässä työprofiilia tähän selaimeen ja antamassa järjestelmänvalvojalle oikeuden hallita pelkkää työprofiilia. {0,plural, =0{Chrome-päivitys on saatavilla}=1{Chrome-päivitys on saatavilla}other{Chrome-päivitys on ollut saatavilla # vuorokauden ajan}} Chrome-käyttöjärjestelmä ei voi synkronoida tietoja, sillä tilin kirjautumistiedot ovat vanhentuneet. diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 3a5674cd91764e..aecef2f6d3dcb0 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb @@ -248,6 +248,7 @@ Google Chrome ne peut pas récupérer vos paramètres. Vous étiez connecté à Google Chrome en tant que . Veuillez utiliser le même compte pour vous reconnecter. Conditions d'utilisation de Chrome OS Impossible de synchroniser vos données dans Chrome OS, car la synchronisation n'est pas disponible pour votre domaine. +Renforcer la sécurité de Chrome Chromium va accéder à votre Drive pour proposer des suggestions dans la barre d'adresse Google Chrome pour les développeurs Pour savoir si votre appareil est à jour, accédez aux paramètres Chrome OS @@ -306,6 +307,7 @@ Google Chrome ne peut pas récupérer vos paramètres. Vous ne disposez pas des droits requis pour installer la version système. Relancez l'installation en vous connectant comme administrateur. Relancer Google Chrome Pour envoyer un numéro depuis vers votre téléphone Android, connectez-vous à Chrome sur les deux appareils. +Personnalisez les paramètres de confidentialité que Chrome considère comme les plus importants. Ce guide n'inclut ni tous les paramètres, ni toutes les options. Vous êtes sur le point d'ajouter un profil professionnel à ce navigateur et d'en donner le contrôle à votre administrateur. {0,plural, =0{Une mise à jour de Chrome est disponible}=1{Une mise à jour de Chrome est disponible}one{Une mise à jour de Chrome est disponible depuis # jour}other{Une mise à jour de Chrome est disponible depuis # jours}} Impossible de synchroniser vos données dans Chrome OS, car les informations de connexion de votre compte ne sont plus à jour. diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index ac932f197c4ca2..a5af2e6a52786b 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb @@ -242,6 +242,7 @@ Bili ste prijavljeni na Chrome kao . Prijavite se ponovo istim računom. Uvjeti za OS Chrome OS Chrome nije mogao sinkronizirati vaše podatke jer sinkronizacija nije dostupna za vašu domenu. +Odaberite najsnažniju Chromeovu zaštitu sigurnosti Chrome će pristupati vašem Disku radi prikazivanja prijedloga u adresnoj traci Google Chrome Dev Ažurnost uređaja možete provjeriti u postavkama OS-a Chrome @@ -300,6 +301,8 @@ Nemate odgovarajuća prava za instaliranje na razini sustava. Pokušajte ponovno pokrenuti program za instalaciju kao administrator. Ponovo pokrenite Chrome Da biste poslali broj s uređaja na svoj Android telefon, prijavite se na Chrome na oba uređaja. +Prilagodite odabire u vezi s privatnošću koje Chrome smatra najvažnijima. Ovaj vodič ne sadrži sve postavke i opcije. +Uključili ste poboljšano sigurno pregledavanje na svom računu. Sada ga preuzmite za Chrome. Dodat ćete poslovni profil u ovaj preglednik i dati administratoru kontrolu samo nad poslovnim profilom. {0,plural, =0{Dostupno je ažuriranje Chromea}=1{Dostupno je ažuriranje Chromea}one{Ažuriranje Chromea dostupno je # dana}few{Ažuriranje Chromea dostupno je # dana}other{Ažuriranje Chromea dostupno je # dana}} OS Chrome nije mogao sinkronizirati vaše podatke jer su vaši podaci za prijavu na račun zastarjeli. diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index ba7fcf95c0f4a9..9c45c4713206ba 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb @@ -242,6 +242,7 @@ Anda telah masuk ke Chrome sebagai . Gunakan akun yang sama untuk masuk kembali. Persyaratan Chrome OS Chrome OS tidak dapat menyinkronkan data Anda karena Sinkronisasi tidak tersedia untuk domain Anda. +Dapatkan keamanan terkuat Chrome Chrome akan mengakses Drive Anda untuk membuat saran di kolom URL Google Chrome Dev Untuk melihat apakah versi pada perangkat Anda adalah yang terbaru, buka Setelan Chrome OS @@ -300,6 +301,7 @@ Anda tidak memiliki hak yang diperlukan untuk pemasangan tingkat sistem. Coba jalankan lagi pemasang saat login sebagai Administrator. Luncurkan Ulang Chrome Untuk mengirimkan nomor dari ke ponsel Android Anda, login ke Chrome di kedua perangkat. +Sesuaikan pilihan privasi yang dianggap paling penting oleh Chrome. Panduan ini tidak mencakup semua setelan dan opsi. Anda menambahkan profil kerja ke browser ini dan memberikan kontrol kepada administrator hanya untuk profil kerja. {0,plural, =0{Update Chrome tersedia}=1{Update Chrome tersedia}other{Update Chrome telah tersedia selama # hari}} Chrome OS tidak dapat menyinkronkan data karena detail ID masuk akun Anda belum diperbarui. diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index 0f93f7c67fed0c..92a73db29f522a 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb @@ -240,6 +240,7 @@ Hai eseguito l'accesso a Chrome come . Utilizza lo stesso account per eseguire di nuovo l'accesso. Termini di Chrome OS Impossibile sincronizzare i dati in Chrome OS perché la sincronizzazione non è disponibile per il tuo dominio. +Usa la funzionalità di sicurezza più efficace di Chrome Chrome accederà al tuo Drive per inserire suggerimenti nella barra degli indirizzi Google Chrome Dev Per controllare se il tuo dispositivo è aggiornato, vai alle Impostazioni di Chrome OS @@ -298,6 +299,8 @@ Non disponi dei diritti appropriati per l'installazione a livello di sistema. Prova a eseguire nuovamente il programma di installazione come Amministratore. Riavvia Chrome Per inviare un numero da al tuo telefono Android, accedi a Chrome su entrambi i dispositivi. +Personalizza le opzioni relative alla privacy considerate più importanti da Chrome. Questa guida non include tutte le impostazioni e opzioni. +Hai attivato la Navigazione sicura avanzata nel tuo account. Ora attivala per Chrome. Stai per aggiungere a questo browser un profilo di lavoro che sarà controllato dal tuo amministratore. {0,plural, =0{È disponibile un aggiornamento di Chrome}=1{È disponibile un aggiornamento di Chrome}one{È disponibile un aggiornamento di Chrome da # giorni}other{È disponibile un aggiornamento di Chrome da # giorni}} Impossibile sincronizzare i dati in Chrome OS perché i dati di accesso dell'account sono obsoleti. diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index abc5b3ba98c03b..6f3c49146457a1 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb @@ -242,6 +242,7 @@ ‏התחברת ל-Chrome כ-. יש להשתמש באותו חשבון כדי להיכנס שוב. ‏תנאים עבור מערכת ההפעלה של Chrome ‏מערכת ההפעלה של Chrome לא הצליחה לסנכרן את הנתונים שלך מפני שהסנכרון אינו זמין עבור הדומיין שלך. +‏רוצה להשיג את רמת האבטחה הגבוהה ביותר של Chrome? ‏Chrome ייגש ל-Drive שלך כדי להציג הצעות בשורת כתובת האתר ‏גרסת הפיתוח של Google Chrome ‏כדי לראות אם המכשיר שלך מעודכן, יש לעבור אל הגדרות Chrome OS @@ -300,6 +301,7 @@ אין לך זכויות שמתאימות להתקנה ברמת המערכת. יש לנסות להפעיל שוב את המתקין כמנהל מערכת. ‏הפעלה מחדש של Chrome ‏כדי לשלוח מספר מ- לטלפון Android, יש להיכנס אל Chrome בשני המכשירים. +‏התאמה אישית של העדפות הפרטיות הכי חשובות מבחינת Chrome. המדריך הזה לא כולל את כל ההגדרות והאפשרויות. בחרת להוסיף פרופיל עבודה לדפדפן זה ולתת למנהל המערכת שליטה רק על פרופיל העבודה. {0,plural, =0{‏יש עדכון זמין ל-Chrome}=1{‏יש עדכון זמין ל-Chrome}two{‏עדכון ל-Chrome זמין כבר # ימים}many{‏עדכון ל-Chrome זמין כבר # ימים}other{‏עדכון ל-Chrome זמין כבר # ימים}} ‏מערכת ההפעלה של Chrome לא הצליחה לסנכרן את הנתונים שלך מפני שפרטי הכניסה של חשבונך אינם מעודכנים. diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index cccaa75553f51f..b7f145205e3409 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb @@ -250,6 +250,7 @@ Chrome에서 설정을 복구할 수 없습니다. (으)로 Chrome에 로그인되어 있습니다. 같은 계정으로 다시 로그인해 주세요. Chrome OS 이용약관 내 도메인에서 동기화를 사용할 수 없으므로 Chrome OS에서 데이터를 동기화하지 못했습니다. +Chrome의 가장 강력한 보안 기능을 이용하세요 Chrome에서 내 드라이브에 액세스하여 주소 표시줄에 추천 검색어를 표시합니다. Chrome 개발자 기기가 최신 버전인지 확인하려면 Chrome OS 설정으로 이동하세요. @@ -308,6 +309,7 @@ Chrome에서 설정을 복구할 수 없습니다. 시스템 수준의 설치 권한이 없습니다. 관리자 권한으로 설치 프로그램을 다시 실행해 보세요. Chrome 다시 시작 에서 Android 휴대전화로 번호를 전송하려면 두 기기 모두에서 Chrome에 로그인하세요. +Chrome에서 가장 중요하게 간주되는 개인 정보 보호 항목을 맞춤설정합니다. 이 가이드에서 다루지 않는 설정과 옵션도 있습니다. 직장 프로필을 이 브라우저에 추가하고 직장 프로필 제어 권한을 관리자에게 부여합니다. {0,plural, =0{Chrome 업데이트 출시}=1{Chrome 업데이트 출시}other{Chrome 업데이트가 출시된 지 #일 지남}} 계정의 로그인 세부정보가 오래되어 Chrome OS에서 데이터를 동기화하지 못했습니다. diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index 2dfa4d08187bea..4fe35efbda18a1 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb @@ -245,6 +245,7 @@ Dažas funkcijas var nebūt pieejamas. Norādiet citu profila direktoriju vai li Pārlūkā Chrome iepriekš pierakstījāties kā lietotājs . Lai pierakstītos vēlreiz, lūdzu, izmantojiet to pašu kontu. Chrome OS noteikumi Chrome OS nevarēja sinhronizēt jūsu datus, jo sinhronizācija jūsu domēnā nav pieejama. +Visaugstākais Chrome drošības līmenis Pārlūkā Chrome tiks izmantota Diskā pieejamā informācija, lai adrešu joslā piedāvātu ieteikumus Google Chrome Dev Lai pārbaudītu, vai ierīce ir atjaunināta, pārejiet uz sadaļu Chrome OS iestatījumi. @@ -303,6 +304,7 @@ Dažas funkcijas var nebūt pieejamas. Norādiet citu profila direktoriju vai li Jums nav vajadzīgo tiesību, lai instalētu sistēmas līmenī. Mēģiniet vēlreiz palaist instalēšanas programmu kā administrators. Atkārtoti palaist pārlūkprogrammu Chrome Lai nosūtītu numuru no vietnes uz savu Android tālruni, abās ierīcēs pierakstieties pārlūkā Chrome. +Pielāgojiet Chrome vissvarīgākos konfidencialitātes iestatījumus. Šajā ceļvedī nav iekļauti visi iestatījumi un opcijas. Jūs pievienosiet šai pārlūkprogrammai darba profilu un piešķirsiet administratoram kontroli tikai pār darba profilu. {0,plural, =0{Ir pieejams Chrome atjauninājums}=1{Ir pieejams Chrome atjauninājums}zero{Chrome atjauninājums ir pieejams jau # dienu}one{Chrome atjauninājums ir pieejams jau # dienu}other{Chrome atjauninājums ir pieejams jau # dienas}} Chrome OS nevarēja sinhronizēt jūsu datus, jo jūsu konta pierakstīšanās informācija ir novecojusi. diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index 2da350619b8c5a..243fc2a17ef7fd 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb @@ -308,6 +308,7 @@ Google Chrome не може да ги обнови вашите поставки Немате соодветни права за инсталирање на системско ниво. Обидете се да го извршите инсталаторот повторно како администратор. Рестартирајте го Chrome За да испратите број од до телефонот со Android, најавете се на Chrome на двата уреда. +Вклучивте „Подобрено безбедно прелистување“ во вашата сметка. Сега вклучете го за Chrome. Додавате работен профил во овој прелистувач и му давате контрола на администраторот само врз тој профил. {0,plural, =0{Достапно е ажурирање за Chrome}=1{Достапно е ажурирање за Chrome}one{Достапно е ажурирање за Chrome веќе # ден}other{Достапно е ажурирање за Chrome веќе # дена}} Chrome OS не може да ги синхронизира вашите податоци бидејќи вашите информации за пријавување на сметката се застарени. diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index c5fd9910e6e0c7..8ebf97cc67f48f 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb @@ -310,6 +310,7 @@ Chrome വീണ്ടും സമാരംഭിക്കുക എന്നതിൽ നിന്ന് നിങ്ങളുടെ Android ഫോണിലേക്ക് ഒരു നമ്പർ അയയ്‌ക്കാൻ, രണ്ട് ഉപകരണങ്ങളിൽ നിന്നും Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക. ഏറ്റവും പ്രധാനപ്പെട്ടതായി Chrome കരുതുന്ന സ്വകാര്യതാ തിരഞ്ഞെടുപ്പുകൾ ഇഷ്ടാനുസൃതമാക്കുക. ഈ ഗൈഡിൽ എല്ലാ ക്രമീകരണവും ഓപ്ഷനും ഉൾപ്പെടുന്നില്ല. +നിങ്ങളുടെ അക്കൗണ്ടിൽ മെച്ചപ്പെടുത്തിയ സുരക്ഷിത ബ്രൗസിംഗ് ഓണാക്കിയിരിക്കുന്നു. ഇപ്പോൾ അത് Chrome-ലും നേടൂ. നിങ്ങൾ ഈ ബ്രൗസറിലേക്ക് ഒരു ഔദ്യോഗിക പ്രൊഫൈൽ ചേർക്കുകയും നിങ്ങളുടെ അഡ്മിന് ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാത്രം നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു. {0,plural, =0{Chrome-നൊരു അപ്‌ഡേറ്റ് ലഭ്യമാണ്}=1{Chrome-നൊരു അപ്‌ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസമായി Chrome-നൊരു അപ്‌ഡേറ്റ് ലഭ്യമാണ്}} നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സൈൻ ഇൻ വിശദാംശങ്ങൾ കാലഹരണപ്പെട്ടതിനാൽ Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index a6a08776588f82..e58abfd6f5dcd7 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb @@ -242,6 +242,7 @@ tetapan OS Chrome anda Anda telah log masuk ke Chrome sebagai . Sila gunakan akaun yang sama untuk log masuk lagi. Syarat Chrome OS OS Chrome tidak dapat menyegerakkan data anda kerana Segerak tidak tersedia untuk domain anda. +Dapatkan keselamatan Chrome yang paling kukuh Chrome akan mengakses Drive anda untuk membuat cadangan dalam bar alamat Google Chrome Dev Untuk melihat sama ada peranti anda telah dikemas kini, pergi ke Tetapan OS Chrome @@ -300,6 +301,7 @@ tetapan OS Chrome anda Anda tidak mempunyai hak wajar untuk pemasangan peringkat sistem. Cuba jalankan pemasang semula sebagai Pentadbir. Lancarkan semula Chrome Untuk menghantar nombor daripada ke telefon Android anda, log masuk ke Chrome pada kedua-dua peranti. +Sesuaikan pilihan privasi yang dianggap paling penting oleh Chrome. Panduan ini tidak merangkumi setiap tetapan dan pilihan. Anda menambahkan profil kerja pada penyemak imbas ini dan memberi pentadbir anda kawalan terhadap profil kerja sahaja. {0,plural, =0{Kemas kini Chrome tersedia}=1{Kemas kini Chrome tersedia}other{Kemas kini Chrome telah tersedia selama # hari}} OS Chrome tidak dapat menyegerakkan data anda kerana butiran log masuk akaun anda sudah lapuk. diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index b8a9aba8d215b1..e682a6c82df3f4 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb @@ -246,6 +246,7 @@ Sommige functies zijn wellicht niet beschikbaar. Geef een andere profieldirector Je bent ingelogd bij Chrome als . Gebruik hetzelfde account om opnieuw in te loggen. Voorwaarden van Chrome OS Chrome OS kan je gegevens niet synchroniseren omdat synchronisatie niet beschikbaar is voor je domein. +Gebruik het hoogste beveiligingsniveau van Chrome Chrome gebruikt de toegang tot je Drive om suggesties te doen in de adresbalk Google Chrome Dev Ga naar de instellingen van Chrome OS om te kijken of je apparaat up-to-date is @@ -304,6 +305,8 @@ Sommige functies zijn wellicht niet beschikbaar. Geef een andere profieldirector Je hebt geen rechten om op systeemniveau te installeren. Meld je aan als beheerder en voer het installatieprogramma opnieuw uit. Chrome opnieuw starten Als je een nummer vanaf naar je Android-telefoon wilt sturen, log je in bij Chrome op beide apparaten. +Pas de privacykeuzes aan die Chrome het belangrijkst vindt. Deze gids bevat niet alle instellingen en opties. +Je hebt de uitgebreide versie van Safe Browsing aangezet in je account. Zet deze functie nu ook aan voor Chrome. Je voegt een werkprofiel toe aan deze browser en geeft je beheerder alleen de controle over het werkprofiel. {0,plural, =0{Er is een Chrome-update beschikbaar}=1{Er is een Chrome-update beschikbaar}other{Er is al # dagen een Chrome-update beschikbaar}} Chrome OS kan je gegevens niet synchroniseren omdat de inloggegevens voor je account zijn verouderd. diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb index 97f38cdc72e7f4..1764712c206fca 100644 --- a/chrome/app/resources/google_chrome_strings_or.xtb +++ b/chrome/app/resources/google_chrome_strings_or.xtb @@ -249,6 +249,7 @@ ଭାବରେ ଆପଣ Chromeରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି। ପୁଣିଥରେ ସାଇନ୍ ଇନ୍ କରିବା ପାଇଁ ଦୟାକରି ସେହି ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରନ୍ତୁ। Chrome OS ସର୍ତ୍ତ Chrome OS ଆପଣଙ୍କର ଡାଟାକୁ ସିଙ୍କ୍ କରିପାରିବ ନାହିଁ, କାରଣ ଆପଣଙ୍କ ଡୋମେନ୍ ପାଇଁ ସିଙ୍କ୍ ଉପଲବ୍ଧ ନାହିଁ। +Chromeର ସବୁଠାରୁ ଶକ୍ତିଶାଳୀ ସୁରକ୍ଷା ପାଆନ୍ତୁ ଠିକଣା ବାର୍‌‌ରେ ପ୍ରସ୍ତାବ ଦେବା ପାଇଁ Chrome ଆପଣଙ୍କର ଡ୍ରାଇଭ୍‌କୁ ଆକ୍‌ସେସ୍ କରିବ Google Chrome ଡେଭ୍‍ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଅପ୍ ଟୁ ଡେଟ୍ ଅଛି କି ନାହିଁ, ତାହା ଦେଖିବାକୁ Chrome OS ସେଟିଂସ୍‌କୁ ଯାଆନ୍ତୁ @@ -307,6 +308,7 @@ ସିଷ୍ଟମ୍-ଲେବଲ୍ ସଂସ୍ଥାପନ ପାଇଁ ଆପଣଙ୍କ ପାଖରେ ଉପଯୁକ୍ତ ଅଧିକାର ନାହିଁ । ବ୍ୟବସ୍ଥାପକ ଭାବରେ ପୁନଃ ସଂସ୍ଥାପକ ଚଳାଇବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ । Chrome ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ ରୁ ଆପଣଙ୍କ Android ଫୋନକୁ ଏକ ନମ୍ବର ପଠାଇବାକୁ, ଉଭୟ ଡିଭାଇସରେ Chromeରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ। +Chrome ସବୁଠାରୁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବୋଲି ବିଚାର କରୁଥିବା ଗୋପନୀୟତା ସମ୍ବନ୍ଧିତ ବିକଳ୍ପଗୁଡ଼ିକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ। ଏହି ଗାଇଡରେ ପ୍ରତ୍ୟେକ ସେଟିଂ ଏବଂ ବିକଳ୍ପ ଅନ୍ତର୍ଭୁକ୍ତ ନାହିଁ। ଆପଣ ଏହି ବ୍ରାଉଜରରେ ଏକ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଯୋଗ କରୁଛନ୍ତି ଏବଂ ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କୁ ସେହି ୱାର୍କ ପ୍ରୋଫାଇଲକୁ କେବଳ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅନୁମତି ଦେଉଛନ୍ତି। {0,plural, =0{Chrome‍ର ଏକ ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି}=1{Chrome‍ର ଏକ ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି}other{# ଦିନ ପାଇଁ Chrome‍ର ଏକ ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି}} ଆପଣଙ୍କର ଆକାଉଣ୍ଟ ସାଇନ୍ ଇନ୍ ବିବରଣୀ ପୁରୁଣା ହୋଇଥିବା ଯୋଗୁଁ Chrome OS ଆପଣଙ୍କର ଡାଟା ସିଙ୍କ୍ କରିପାରିଲା ନାହିଁ। diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 9f1213732ce028..bd560b7812b1a2 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb @@ -250,6 +250,7 @@ Google Chrome ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਮੁੜ-ਹਾ ਤੁਸੀਂ ਵਜੋਂ Chrome 'ਤੇ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਓਹੀ ਖਾਤਾ ਵਰਤੋ। Chrome OS ਸ਼ਰਤਾਂ Chrome OS ਤੁਹਾਡਾ ਡਾਟਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਸਮਕਾਲੀਕਰਨ ਤੁਹਾਡੀ ਡੋਮੇਨ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। +Chrome ਦੀ ਸਭ ਤੋਂ ਮਜਬੂਤ ਸੁਰੱਖਿਆ ਪ੍ਰਾਪਤ ਕਰੋ ਪਤਾ ਬਾਰ ਵਿੱਚ ਸੁਝਾਅ ਦੇਣ ਲਈ Chrome ਤੁਹਾਡੀ 'ਡਰਾਈਵ' ਤੱਕ ਪਹੁੰਚ ਕਰੇਗਾ Google Chrome Dev ਇਹ ਦੇਖਣ ਲਈ ਕਿ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਅੱਪ-ਟੂ-ਡੇਟ ਹੈ ਜਾਂ ਨਹੀਂ, Chrome OS ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ @@ -308,6 +309,7 @@ Google Chrome ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਮੁੜ-ਹਾ ਤੁਹਾਡੇ ਕੋਲ ਸਿਸਟਮ-ਪੱਧਰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਉਚਿਤ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਪ੍ਰਬੰਧਕ ਦੇ ਤੌਰ 'ਤੇ ਦੁਬਾਰਾ ਸਥਾਪਨਾਕਾਰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ। Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ ਤੋਂ ਆਪਣੇ Android ਫ਼ੋਨ 'ਤੇ ਨੰਬਰ ਭੇਜਣ ਲਈ, ਦੋਵੇਂ ਡੀਵਾਈਸਾਂ 'ਤੇ Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ। +ਉਨ੍ਹਾਂ ਪਰਦੇਦਾਰੀ ਵਿਕਲਪਾਂ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ ਜਿਨ੍ਹਾਂ ਨੂੰ Chrome ਸਭ ਤੋਂ ਮਹੱਤਵਪੂਰਨ ਸਮਝਦਾ ਹੈ। ਇਸ ਗਾਈਡ ਵਿੱਚ ਹਰ ਸੈਟਿੰਗ ਅਤੇ ਵਿਕਲਪ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਕੋਈ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਸ਼ਾਮਲ ਕਰ ਰਹੇ ਹੋ ਅਤੇ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸਿਰਫ਼ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ 'ਤੇ ਕੰਟਰੋਲ ਦੇ ਰਹੇ ਹੋ। {0,plural, =0{Chrome ਅੱਪਡੇਟ ਉਪਲਬਧ ਹੈ}=1{Chrome ਅੱਪਡੇਟ ਉਪਲਬਧ ਹੈ}other{Chrome ਅੱਪਡੇਟ # ਦਿਨਾਂ ਤੋਂ ਉਪਲਬਧ ਹੈ}} Chrome OS ਤੁਹਾਡਾ ਡਾਟਾ ਸਿੰਕ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਖਾਤਾ ਸਾਈਨ-ਇਨ ਵੇਰਵੇ ਪੁਰਾਣੇ ਹਨ। diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index b8bd29ef1dc2b5..ef3dba9d0e3534 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb @@ -240,6 +240,7 @@ Byłeś zalogowany w Chrome jako . Zaloguj się ponownie, korzystając z tego samego konta. Warunki korzystania z Chrome OS System operacyjny Chrome nie może zsynchronizować danych, ponieważ synchronizacja jest niedostępna w Twojej domenie. +Korzystaj z najlepszych zabezpieczeń Chrome Chrome będzie mieć dostęp do Dysku, by wyświetlać podpowiedzi na pasku adresu Wersja deweloperska Google Chrome Aby sprawdzić, czy urządzenie jest zaktualizowane, otwórz ustawienia systemu operacyjnego Chrome @@ -298,6 +299,8 @@ Nie masz odpowiednich uprawnień do przeprowadzenia instalacji na poziomie systemowym. Uruchom ponownie program instalacyjny jako administrator. Uruchom Chrome ponownie Aby wysłać numer z  na swój telefon z Androidem, zaloguj się w Chrome na obu urządzeniach. +Dostosuj opcje prywatności, które Chrome uważa za najważniejsze. Ten przewodnik nie uwzględnia wszystkich ustawień ani opcji. +Na swoim koncie włączyłeś(-aś) Ulepszone Bezpieczne przeglądanie. Zacznij korzystać z tej funkcji w Chrome. Dodajesz profil służbowy w tej przeglądarce i dajesz swojemu administratorowi kontrolę tylko nad tym profilem. {0,plural, =0{Dostępna jest aktualizacja Chrome}=1{Dostępna jest aktualizacja Chrome}few{Aktualizacja Chrome jest dostępna od # dni}many{Aktualizacja Chrome jest dostępna od # dni}other{Aktualizacja Chrome jest dostępna od # dnia}} Google Chrome nie może zsynchronizować danych, ponieważ dane logowania na Twoje konto są nieaktualne. diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 051137d9e05115..2351fa4cc18502 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb @@ -301,6 +301,7 @@ Reiniciar o Google Chrome Para enviar um número de ao seu smartphone Android, faça login no Chrome nos dois dispositivos. Personalize as opções de privacidade mais importantes para o Chrome. Este guia não inclui todas as configurações e opções. +Você ativou o Navegação segura com maior proteção na sua conta. Agora, ative-o no Chrome. Você está adicionando um perfil de trabalho a este navegador. O administrador poderá controlar apenas o perfil de trabalho. {0,plural, =0{Uma atualização do Chrome está disponível}=1{Uma atualização do Chrome está disponível}one{Uma atualização do Chrome está disponível há # dia}other{Uma atualização do Chrome está disponível há # dias}} O Chrome OS não pôde sincronizar seus dados porque os detalhes de login da sua conta estão desatualizados. diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 3643e8d5015ee7..b290eb037533bb 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb @@ -240,6 +240,7 @@ Ранее вы входили в Chrome как . Войдите снова, используя тот же аккаунт. Условия использования Chrome OS Не удалось синхронизировать данные, поскольку сервис Sync недоступен в вашем домене. +Обеспечьте максимальную защиту в Chrome Chrome получит доступ к Google Диску, чтобы вы могли просматривать рекомендации в адресной строке Google Chrome для разработчиков Чтобы посмотреть, обновлена ли операционная система устройства, перейдите в настройки Chrome OS. @@ -298,6 +299,7 @@ У вас нет прав, необходимых для установки на системном уровне. Запустите программу установки еще раз в качестве администратора. Перезапустить Chrome Чтобы отправить номер с сайта на свой телефон Android, войдите в Chrome на обоих устройствах. +Настройте самые важные параметры конфиденциальности Chrome. В этом руководстве указаны не все настройки. После добавления рабочего профиля администратор не сможет управлять другими профилями. {0,plural, =0{Доступно обновление Chrome}=1{Доступно обновление Chrome}one{Обновление Chrome доступно # день}few{Обновление Chrome доступно # дня}many{Обновление Chrome доступно # дней}other{Обновление Chrome доступно # дня}} Не удалось выполнить синхронизацию, так как учетные данные устарели. diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index a9ef4a3431ddea..afa333e8382190 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb @@ -250,6 +250,7 @@ Google Chrome ne more obnoviti vaših nastavitev. V Chrome ste bili prijavljeni kot . Pri vnovični prijavi uporabite isti račun. Pogoji za Chrome OS Chrome OS ni mogel sinhronizirati podatkov, ker sinhronizacija ni na voljo za vašo domeno. +Izberite Chromovo najmočnejšo varnost Chrome bo dostopal do Googla Drive zaradi ponujanja predlogov v naslovni vrstici Google Chrome Dev Če želite preveriti, ali je naprava posodobljena, odprite nastavitve sistema OS Chrome @@ -308,6 +309,7 @@ Google Chrome ne more obnoviti vaših nastavitev. Nimate ustreznih pravic za namestitev na ravni sistema. Poskusite znova zagnati namestitveni program kot skrbnik. Znova zaženi Chrome Če želite telefonsko številko iz poslati v telefon Android, se prijavite v Chrome v obeh napravah. +Prilagodite izbire glede zasebnosti, ki jih Chrome obravnava kot najpomembnejše. V tem vodniku niso vse nastavitve in možnosti. V ta brskalnik dodajate delovni profil in skrbniku omogočate nadzor samo nad delovnim profilom. {0,plural, =0{Posodobitev za Chrome je na voljo}=1{Posodobitev za Chrome je na voljo}one{Posodobitev za Chrome je na voljo že # dan}two{Posodobitev za Chrome je na voljo že # dneva}few{Posodobitev za Chrome je na voljo že # dni}other{Posodobitev za Chrome je na voljo že # dni}} Chrome OS ni mogel sinhronizirati podatkov, ker so podatki za prijavo v račun zastareli. diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index de6e8354c74b83..fe5fe692ca15b7 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb @@ -249,6 +249,7 @@ Google Chrome nuk është në gjendje të rikuperojë cilësimet e tua.Ishe i identifikuar në Chrome si . Përdor të njëjtën llogari për t'u identifikuar sërish. Kushtet e sistemit operativ Chrome Sistemi operativ Chrome nuk mund të sinkronizonte të dhënat e tua sepse "Sinkronizimi" nuk mundësohet për domenin tënd. +Merr sigurinë më të fortë të Chrome Chrome do të ketë qasje te "Disku" yt për të dhënë sugjerime në shiritin e adresës Google Chrome Dev Për të parë nëse pajisja jote është e përditësuar, shko te Cilësimet e sistemit operativ Chrome @@ -307,6 +308,7 @@ Google Chrome nuk është në gjendje të rikuperojë cilësimet e tua.Nuk ke të drejtat e duhura për instalimin në nivel sistemi. Provo ta ekzekutosh përsëri instaluesin si Administrator. Rinis Chrome Për të dërguar një numër nga te telefoni yt Android, identifikohu në Chrome në të dyja pajisjet. +Personalizo zgjedhjet e privatësisë që Chrome konsideron si më të rëndësishmet. Ky udhëzues nuk përfshin çdo cilësim dhe opsion. Po shton një profil pune në këtë shfletues dhe po i jep administratorit tënd kontrollin vetëm mbi profilin e punës. {0,plural, =0{Ofrohet një përditësim i Chrome}=1{Ofrohet një përditësim i Chrome}other{Një përditësim i Chrome ofrohet prej # ditësh}} Sistemi operativ Chrome nuk mund të sinkronizonte të dhënat e tua sepse detajet e identifikimit të llogarisë nuk janë të përditësuara. diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb index 845d6a4c70d11a..08ce769ab552ac 100644 --- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb +++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb @@ -310,6 +310,7 @@ Google Chrome ne može da vrati podešavanja. Ponovo pokreni Chrome Da biste poslali broj sa na Android telefon, prijavite se u Chrome na oba uređaja. Prilagodite podešavanja privatnosti koja Chrome smatra najvažnijim. Ovaj vodič ne obuhvata svako podešavanje i opciju. +Uključili ste poboljšano bezbedno pregledanje na nalogu. Uključite ga i za Chrome. Dodajete poslovni profil u ovaj pregledač i dajete administratoru kontrolu samo nad ovim poslovnim profilom. {0,plural, =0{Ažuriranje za Chrome je dostupno}=1{Ažuriranje za Chrome je dostupno}one{Ažuriranje za Chrome je dostupno već # dan}few{Ažuriranje za Chrome je dostupno već # dana}other{Ažuriranje za Chrome je dostupno već # dana}} Chrome OS ne može da sinhronizuje podatke zato što su podaci za prijavljivanje na nalog zastareli. diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index 2ece4f80e2eb71..155c59e4bdae7e 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb @@ -310,6 +310,7 @@ Google Chrome не може да врати подешавања. Поново покрени Chrome Да бисте послали број са на Android телефон, пријавите се у Chrome на оба уређаја. Прилагодите подешавања приватности која Chrome сматра најважнијим. Овај водич не обухвата свако подешавање и опцију. +Укључили сте побољшано безбедно прегледање на налогу. Укључите га и за Chrome. Додајете пословни профил у овај прегледач и дајете администратору контролу само над овим пословним профилом. {0,plural, =0{Ажурирање за Chrome је доступно}=1{Ажурирање за Chrome је доступно}one{Ажурирање за Chrome је доступно већ # дан}few{Ажурирање за Chrome је доступно већ # дана}other{Ажурирање за Chrome је доступно већ # дана}} Chrome ОС не може да синхронизује податке зато што су подаци за пријављивање на налог застарели. diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 424808a5f515fa..dbe3b22af97b51 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb @@ -308,6 +308,7 @@ Google Chrome kan inte återställa dina inställningar. Du har inte behörighet att göra en installation på systemnivå. Försök köra installationsprogrammet igen som administratör. Starta om Chrome Logga in på Chrome på båda enheterna om du vill skicka ett nummer från till Android-telefonen. +Du har aktiverat Förbättrad säker webbsökning i kontot. Skaffa funktionen även för Chrome. Du lägger till en jobbprofil i den här webbläsaren och ger administratören kontrollen enbart över jobbprofilen. {0,plural, =0{Det finns en uppdatering för Chrome}=1{Det finns en uppdatering för Chrome}other{Det finns en uppdatering för Chrome sedan # dagar}} Det gick inte att synkronisera data med Chrome OS eftersom inloggningsuppgifterna för kontot är inaktuella. diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 4ad39544e5bb57..e8ce01c0bbd486 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb @@ -242,6 +242,7 @@ Chromeல் ஆக உள்நுழைந்திருந்தீர்கள். மீண்டும் உள்நுழைய அதே கணக்கைப் பயன்படுத்தவும். Chrome OS விதிமுறைகள் உங்கள் களத்திற்கு ஒத்திசைவு கிடைக்கவில்லை என்பதால், Chrome OS ஆல் உங்கள் தரவை ஒத்திசைக்க முடியவில்லை. +Chromeமின் உச்சபட்சப் பாதுகாப்பைப் பெறுங்கள் முகவரிப் பட்டியில் பரிந்துரைகளை வழங்க, Chrome உங்கள் இயக்ககத்தை அணுகும் Google Chrome Dev உங்கள் சாதனம் புதுப்பித்த நிலையில் உள்ளதா என்பதைப் பார்க்க Chrome OS அமைப்புகளுக்குச் செல்லவும் @@ -300,6 +301,7 @@ கம்ப்யூட்டர்-சார்ந்த நிறுவலுக்கான முறையான உரிமைகள் உங்களிடம் இல்லை. அதனால் நிர்வாகியாக மீண்டும் நிறுவலை இயக்க முயற்சி செய்க. Chrome ஐ மீண்டும் தொடங்கு என்ற தளத்தில் இருந்து உங்கள் Android மொபைலுக்கு ஓர் எண்ணை அனுப்ப, இரு சாதனங்களிலும் Chromeமில் உள்நுழையுங்கள். +Chromeமிற்கு மிக முக்கியமாக இருக்கும் தனியுரிமை விருப்பங்களைப் பிரத்தியேகமாக்கலாம். சில அமைப்புகளும் விருப்பங்களும் மட்டுமே இந்த வழிகாட்டியில் இருக்கும். இந்த உலாவியில் ஒரு பணிக் கணக்கைச் சேர்த்து, அதற்கு மட்டுமான கட்டுப்பாட்டையே உங்கள் நிர்வாகிக்கு வழங்குகிறீர்கள். {0,plural, =0{Chromeமிற்கான புதுப்பிப்பு உள்ளது}=1{Chromeமிற்கான புதுப்பிப்பு உள்ளது}other{Chromeமிற்கான புதுப்பிப்பு வந்து # நாட்களாகிறது}} உங்கள் கணக்கின் உள்நுழைவு விவரங்கள் காலாவதியாகிவிட்டதால், உங்கள் தரவை Chrome OS ஆல் ஒத்திசைக்க முடியவில்லை. diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index b16ec740500c83..e6422eafbbe54b 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb @@ -302,6 +302,7 @@ Chromeను పునఃప్రారంభించు నుండి మీ Android ఫోన్‌కు నంబర్‌ను పంపడానికి, రెండు పరికరాలలోని Chromeకు సైన్ ఇన్ చేయండి. Chrome అత్యంత ముఖ్యమైనవిగా పరిగణించే గోప్యతా ఎంపికలను అనుకూలంగా మార్చండి. ఈ గైడ్‌ ప్రతి సెట్టింగ్, ఆప్షన్‌ను కలిగి ఉండదు. +మీరు మీ ఖాతాలో మెరుగైన సురక్షిత బ్రౌజింగ్‌ను ఆన్ చేశారు. ఇప్పుడు దాన్ని Chromeలో పొందండి. మీరు ఈ బ్రౌజర్‌కు వర్క్ ప్రొఫైల్‌ను జోడిస్తున్నారు, ఇంకా మీ అడ్మినిస్ట్రేటర్‌కు వర్క్ ప్రొఫైల్‌పై కంట్రోల్ ఇస్తున్నారు. {0,plural, =0{ఒక Chrome అప్‌డేట్ అందుబాటులో ఉంది}=1{ఒక Chrome అప్‌డేట్ అందుబాటులో ఉంది}other{ఒక Chrome అప్‌డేట్ # రోజులుగా అందుబాటులో ఉంది}} మీ ఖాతా సైన్-ఇన్ వివరాల గడువు ముగిసినందున Chrome OS మీ డేటాను సింక్ చేయ‌లేకపోయింది. diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index 61c11c26985ce1..8f4527c5483133 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb @@ -242,6 +242,7 @@ Ви ввійшли в Chrome як . Скористайтеся тим самим обліковим записом, щоб увійти знову. Умови ОС Chrome ОС Chrome не вдалося синхронізувати ваші дані, оскільки синхронізація для вашого домену недоступна. +Отримайте найвищий рівень безпеки в Chrome Chrome матиме доступ до Диска, щоб робити пропозиції в адресному рядку Версія Google Chrome для розробників Щоб дізнатися, чи пристрій використовує актуальну версію операційної системи, перейдіть у налаштування ОС Chrome @@ -300,6 +301,7 @@ У вас немає відповідних прав для встановлення на рівні системи. Спробуйте запустити програму встановлення, увійшовши з правами адміністратора. Перезапустити Chrome Щоб надіслати номер із сайту на телефон Android, увійдіть у Chrome на обох пристроях. +Персоналізуйте параметри конфіденційності, які Chrome вважає найважливішими. Цей посібник містить не всі налаштування й параметри. Ви додаєте в цей веб-переглядач робочий профіль і дозволяєте адміністратору керувати лише ним. {0,plural, =0{Доступне оновлення Chrome}=1{Доступне оновлення Chrome}one{Оновлення Chrome доступне вже # день}few{Оновлення Chrome доступне вже # дні}many{Оновлення Chrome доступне вже # днів}other{Оновлення Chrome доступне вже # дня}} ОС Chrome не вдалося синхронізувати ваші дані, оскільки дані для входу в обліковий запис застаріли. diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index fff146e4dbec91..ef40bf6900571d 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb @@ -246,6 +246,7 @@ Một số tính năng có thể không khả dụng. Vui lòng chỉ định th Bạn đã đăng nhập vào Chrome là . Vui lòng sử dụng cùng tài khoản để đăng nhập lại. Điều khoản của Chrome OS Chrome OS không thể đồng bộ hóa dữ liệu của bạn vì Đồng bộ hóa không khả dụng với miền của bạn. +Có được chế độ bảo mật mạnh nhất của Chrome Chrome sẽ truy cập vào Drive của bạn để đưa ra đề xuất trên thanh địa chỉ Google Chrome Dev Để kiểm tra xem thiết bị của bạn đã cập nhật hay chưa, hãy chuyển đến phần Cài đặt Chrome OS @@ -304,6 +305,7 @@ Một số tính năng có thể không khả dụng. Vui lòng chỉ định th Bạn không có quyền thích hợp để cài đặt cấp hệ thống. Thử chạy lại trình cài đặt với vai trò Quản trị viên. Chạy lại Chrome Để gửi số điện thoại từ đến điện thoại Android của bạn, hãy đăng nhập vào Chrome trên cả hai thiết bị. +Tuỳ chỉnh những lựa chọn về quyền riêng tư mà Chrome coi là quan trọng nhất. Hướng dẫn này không bao gồm mọi chế độ cài đặt và tuỳ chọn. Bạn đang thêm một hồ sơ công việc vào trình duyệt này và chỉ quản trị viên của bạn mới có quyền kiểm soát hồ sơ công việc này. {0,plural, =0{Đã có bản cập nhật Chrome}=1{Đã có bản cập nhật Chrome}other{Đã có bản cập nhật Chrome từ # ngày trước}} Chrome OS không thể đồng bộ hóa dữ liệu của bạn do chi tiết đăng nhập tài khoản của bạn đã lỗi thời. diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index 153407a5692cbb..0f535a54bea723 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb @@ -248,7 +248,7 @@ Google Chrome 無法復原您的設定。 您使用了 的身分登入 Chrome,請使用相同帳戶重新登入。 Chrome 作業系統條款 您的網域無法使用「同步功能」,因此 Chrome 作業系統無法同步處理您的數據。 -獲得 Chrome 最強大的安全防護 +取得 Chrome 最強大的安全防護 Chrome 會存取您的「雲端硬碟」,然後在網址列提出建議 Google Chrome 開發人員版 如要查看裝置是否已更新,請前往 Chrome 作業系統設定 @@ -307,7 +307,7 @@ Google Chrome 無法復原您的設定。 您沒有在系統層級進行安裝的權限,請以管理員的身分執行安裝程式。 重新啟動 Chrome 如要將號碼從 傳送至 Android 手機,請在這兩部裝置上登入 Chrome。 -自訂 Chrome 最重視的隱私權選項。這份指南並未涵蓋所有設定和選項。 +自訂 Chrome 最重視的的私隱選項。此指南並未涵蓋所有設定和選項。 您即將在此瀏覽器中新增工作設定檔,並只將工作設定檔的控制權授予管理員。 {0,plural, =0{有可用的 Chrome 更新}=1{有可用的 Chrome 更新}other{Chrome 更新已發佈 # 天}} 您的帳戶登入詳情尚未更新,因此 Chrome 作業系統無法同步處理您的數據。 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 8fb19e911de86f..7164b37e7ad2d6 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -155,6 +155,7 @@ #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "device/base/features.h" +#include "device/bluetooth/floss/floss_features.h" #include "device/fido/features.h" #include "device/gamepad/public/cpp/gamepad_features.h" #include "device/vr/buildflags/buildflags.h" @@ -3071,6 +3072,9 @@ const FeatureEntry kFeatureEntries[] = { {"bluetooth-wbs-dogfood", flag_descriptions::kBluetoothWbsDogfoodName, flag_descriptions::kBluetoothWbsDogfoodDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kBluetoothWbsDogfood)}, + {"bluetooth-use-floss", flag_descriptions::kBluetoothUseFlossName, + flag_descriptions::kBluetoothUseFlossDescription, kOsCrOS, + FEATURE_VALUE_TYPE(floss::features::kFlossEnabled)}, {"button-arc-network-diagnostics", flag_descriptions::kButtonARCNetworkDiagnosticsName, flag_descriptions::kButtonARCNetworkDiagnosticsDescription, kOsCrOS, diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc index 59033e63938b8f..077246194c2f48 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc @@ -255,15 +255,91 @@ void HandleMemoryResult(MetricCallback callback, } } +void HandleNetworkResult(MetricCallback callback, + CrosHealthdMetricSampler::MetricType metric_type, + MetricData metric_data, + cros_healthd::TelemetryInfoPtr result) { + const auto& network_result = result->network_interface_result; + if (network_result.is_null()) { + std::move(callback).Run(metric_data); + return; + } + + switch (network_result->which()) { + case cros_healthd::NetworkInterfaceResult::Tag::ERROR: { + DVLOG(1) << "cros_healthd: Error getting network result: " + << network_result->get_error()->msg; + break; + } + + case cros_healthd::NetworkInterfaceResult::Tag::NETWORK_INTERFACE_INFO: { + for (const auto& network_info : + network_result->get_network_interface_info()) { + // Handle wireless interface telemetry + if (network_info->is_wireless_interface_info() && + metric_type == CrosHealthdMetricSampler::MetricType::kTelemetry) { + auto* network_telemetry_list = metric_data.mutable_telemetry_data() + ->mutable_networks_telemetry(); + ::reporting::NetworkTelemetry* network_telemetry_out; + + // Find if wireless telemetry already exists in metric data. + for (int i = 0; i < network_telemetry_list->network_telemetry_size(); + i++) { + if (network_telemetry_list->network_telemetry(i).type() == + ::reporting::NetworkType::WIFI) { + network_telemetry_out = + network_telemetry_list->mutable_network_telemetry(i); + } + } + if (!network_telemetry_out) { + network_telemetry_out = + network_telemetry_list->add_network_telemetry(); + } + + // Set data. + auto* const interface_telemetry_out = + network_telemetry_out->add_network_interface_telemetry(); + auto* const wireless_telemetry_out = + interface_telemetry_out->mutable_wireless_interface(); + const auto& wireless_info = + network_info->get_wireless_interface_info(); + + interface_telemetry_out->set_interface_name( + wireless_info->interface_name); + wireless_telemetry_out->set_power_management_enabled( + wireless_info->power_management_on); + + if (wireless_info->wireless_link_info) { + const auto& wireless_link_info = wireless_info->wireless_link_info; + wireless_telemetry_out->set_access_point_address( + wireless_link_info->access_point_address_str); + wireless_telemetry_out->set_tx_bit_rate_mbps( + wireless_link_info->tx_bit_rate_mbps); + wireless_telemetry_out->set_rx_bit_rate_mbps( + wireless_link_info->rx_bit_rate_mbps); + wireless_telemetry_out->set_tx_power_dbm( + wireless_link_info->tx_power_dBm); + wireless_telemetry_out->set_encryption_on( + wireless_link_info->encyption_on); + wireless_telemetry_out->set_link_quality( + wireless_link_info->link_quality); + wireless_telemetry_out->set_signal_level_dbm( + wireless_link_info->signal_level_dBm); + } + } + } + } + } + + std::move(callback).Run(std::move(metric_data)); +} + void OnHealthdInfoReceived(MetricCallback callback, cros_healthd::ProbeCategoryEnum probe_category, CrosHealthdMetricSampler::MetricType metric_type, MetricData metric_data, cros_healthd::TelemetryInfoPtr result) { - if (!result) { - DVLOG(1) << "cros_healthd: null telemetry result"; - return; - } + DCHECK(result); switch (probe_category) { case cros_healthd::ProbeCategoryEnum::kAudio: { @@ -286,6 +362,11 @@ void OnHealthdInfoReceived(MetricCallback callback, std::move(metric_data), std::move(result)); break; } + case cros_healthd::ProbeCategoryEnum::kNetworkInterface: { + HandleNetworkResult(std::move(callback), metric_type, + std::move(metric_data), std::move(result)); + break; + } default: { NOTREACHED(); return; diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc index 4cd6cd500e872d..e970c3510eb5fe 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc @@ -35,9 +35,21 @@ struct MemoryEncryptionTestCase { namespace reporting { namespace test { +// Memory constants. constexpr uint32_t kTmeMaxKeys = 2; constexpr uint32_t kTmeKeysLength = 4; +// Wifi constants. +constexpr char kInterfaceName[] = "interface_name"; +constexpr char kAccessPointAddress[] = "access_point"; +constexpr bool kPowerManagementEnabled = true; +constexpr bool kEncryptionOn = true; +constexpr uint32_t kTxBitRateMbps = 8; +constexpr uint32_t kRxBitRateMbps = 4; +constexpr uint32_t kTxPowerDbm = 2; +constexpr uint32_t kLinkQuality = 1; +constexpr int kSignalLevelDbm = 10; + cros_healthd::KeylockerInfoPtr CreateKeylockerInfo(bool configured) { return cros_healthd::KeylockerInfo::New(configured); } @@ -75,6 +87,36 @@ cros_healthd::TelemetryInfoPtr CreateBusResult( return telemetry_info; } +cros_healthd::TelemetryInfoPtr CreateWifiResult( + const std::string& interface_name, + bool power_management_enabled, + const std::string& access_point_address, + uint32_t tx_bit_rate_mbps, + uint32_t rx_bit_rate_mbps, + uint32_t tx_power_dbm, + bool encryption_on, + uint32_t link_quality, + int signal_level_dbm) { + auto telemetry_info = cros_healthd::TelemetryInfo::New(); + std::vector network_interfaces; + + auto wireless_link_info = cros_healthd::WirelessLinkInfo::New( + access_point_address, tx_bit_rate_mbps, rx_bit_rate_mbps, tx_power_dbm, + encryption_on, link_quality, signal_level_dbm); + auto wireless_interface_info = cros_healthd::WirelessInterfaceInfo::New( + interface_name, power_management_enabled, std::move(wireless_link_info)); + network_interfaces.push_back( + cros_healthd::NetworkInterfaceInfo::NewWirelessInterfaceInfo( + std::move(wireless_interface_info))); + auto network_interface_result = + cros_healthd::NetworkInterfaceResult::NewNetworkInterfaceInfo( + std::move(network_interfaces)); + + telemetry_info->network_interface_result = + std::move(network_interface_result); + return telemetry_info; +} + cros_healthd::AudioInfoPtr CreateAudioInfo( bool output_mute, bool input_mute, @@ -229,6 +271,51 @@ TEST_F(CrosHealthdMetricSamplerTest, SetMetricData) { ::reporting::MEMORY_ENCRYPTION_STATE_DISABLED); } +TEST_F(CrosHealthdMetricSamplerTest, TestWirelessTelemetry) { + // Provide some partially set network telemetry to verify the sampler + // properly builds upon it. + MetricData metric_data; + auto* const network_telemetry_out = metric_data.mutable_telemetry_data() + ->mutable_networks_telemetry() + ->add_network_telemetry(); + network_telemetry_out->set_type(::reporting::NetworkType::WIFI); + network_telemetry_out->set_signal_strength(1); + MetricData result = CollectData( + CreateWifiResult(kInterfaceName, kPowerManagementEnabled, + kAccessPointAddress, kTxBitRateMbps, kRxBitRateMbps, + kTxPowerDbm, kEncryptionOn, kLinkQuality, + kSignalLevelDbm), + cros_healthd::ProbeCategoryEnum::kNetworkInterface, + CrosHealthdMetricSampler::MetricType::kTelemetry, std::move(metric_data)); + + ASSERT_TRUE(result.has_telemetry_data()); + ASSERT_TRUE(result.telemetry_data().has_networks_telemetry()); + ASSERT_EQ( + result.telemetry_data().networks_telemetry().network_telemetry_size(), 1); + + const auto& network_telemetry = + result.telemetry_data().networks_telemetry().network_telemetry(0); + EXPECT_EQ(network_telemetry.type(), ::reporting::NetworkType::WIFI); + EXPECT_EQ(network_telemetry.signal_strength(), 1); + ASSERT_EQ(network_telemetry.network_interface_telemetry_size(), 1); + + const auto& network_interface = + network_telemetry.network_interface_telemetry(0); + EXPECT_EQ(network_interface.interface_name(), kInterfaceName); + ASSERT_TRUE(network_interface.has_wireless_interface()); + + const auto& wireless_interface = network_interface.wireless_interface(); + EXPECT_EQ(wireless_interface.power_management_enabled(), + kPowerManagementEnabled); + EXPECT_EQ(wireless_interface.access_point_address(), kAccessPointAddress); + EXPECT_EQ(wireless_interface.tx_bit_rate_mbps(), kTxBitRateMbps); + EXPECT_EQ(wireless_interface.rx_bit_rate_mbps(), kRxBitRateMbps); + EXPECT_EQ(wireless_interface.tx_power_dbm(), kTxPowerDbm); + EXPECT_EQ(wireless_interface.encryption_on(), kEncryptionOn); + EXPECT_EQ(wireless_interface.link_quality(), kLinkQuality); + EXPECT_EQ(wireless_interface.signal_level_dbm(), kSignalLevelDbm); +} + TEST_F(CrosHealthdMetricSamplerTest, TestKeylockerConfigured) { MetricData result = CollectData(CreateCpuResult(CreateKeylockerInfo(true)), @@ -295,6 +382,17 @@ TEST_F(CrosHealthdMetricSamplerTest, TestMojomError) { std::move(telemetry_info), cros_healthd::ProbeCategoryEnum::kAudio, CrosHealthdMetricSampler::MetricType::kTelemetry); ASSERT_FALSE(audio_data.has_telemetry_data()); + + telemetry_info = cros_healthd::TelemetryInfo::New(); + telemetry_info->network_interface_result = + cros_healthd::NetworkInterfaceResult::NewError( + cros_healthd::ProbeError::New(cros_healthd::ErrorType::kFileReadError, + "")); + const auto& network_data = + CollectError(std::move(telemetry_info), + cros_healthd::ProbeCategoryEnum::kNetworkInterface, + CrosHealthdMetricSampler::MetricType::kTelemetry); + ASSERT_FALSE(network_data.has_telemetry_data()); } TEST_F(CrosHealthdMetricSamplerTest, TestAudioNormalTest) { diff --git a/chrome/browser/chrome_browser_main_linux.cc b/chrome/browser/chrome_browser_main_linux.cc index 0b7ef94ab0c99c..b7a5409b80438a 100644 --- a/chrome/browser/chrome_browser_main_linux.cc +++ b/chrome/browser/chrome_browser_main_linux.cc @@ -56,23 +56,23 @@ ChromeBrowserMainPartsLinux::ChromeBrowserMainPartsLinux( ChromeBrowserMainPartsLinux::~ChromeBrowserMainPartsLinux() { } -void ChromeBrowserMainPartsLinux::PreProfileInit() { -#if !BUILDFLAG(IS_CHROMEOS_ASH) - // Needs to be called after we have chrome::DIR_USER_DATA and - // g_browser_process. This happens in PreCreateThreads. - // base::GetLinuxDistro() will initialize its value if needed. - base::ThreadPool::PostTask( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::BindOnce(base::IgnoreResult(&base::GetLinuxDistro))); -#endif +void ChromeBrowserMainPartsLinux::PostCreateMainMessageLoop() { +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + // No-op: Ash and Lacros Bluetooth DBusManager initialization depend on + // FeatureList, and is done elsewhere. +#else + bluez::BluezDBusManager::Initialize(nullptr /* system_bus */); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) #if !defined(OS_CHROMEOS) - // Set up crypt config. This should be kept in sync with the OSCrypt parts of - // SystemNetworkContextManager::OnNetworkServiceCreated. + // Set up crypt config. This needs to be done before anything starts the + // network service, as the raw encryption key needs to be shared with the + // network service for encrypted cookie storage. // Chrome OS does not need a crypt config as its user data directories are // already encrypted and none of the true encryption backends used by desktop // Linux are available on Chrome OS anyway. - std::unique_ptr config(new os_crypt::Config()); + std::unique_ptr config = + std::make_unique(); // Forward to os_crypt the flag to use a specific password store. config->store = parsed_command_line().GetSwitchValueASCII(switches::kPasswordStore); @@ -85,20 +85,22 @@ void ChromeBrowserMainPartsLinux::PreProfileInit() { parsed_command_line().HasSwitch(switches::kEnableEncryptionSelection); chrome::GetDefaultUserDataDirectory(&config->user_data_path); OSCrypt::SetConfig(std::move(config)); -#endif +#endif // !defined(OS_CHROMEOS) - ChromeBrowserMainPartsPosix::PreProfileInit(); + ChromeBrowserMainPartsPosix::PostCreateMainMessageLoop(); } -void ChromeBrowserMainPartsLinux::PostCreateMainMessageLoop() { -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) - // No-op: Ash and Lacros Bluetooth DBusManager initialization depend on - // FeatureList, and is done elsewhere. -#else - bluez::BluezDBusManager::Initialize(nullptr /* system_bus */); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +void ChromeBrowserMainPartsLinux::PreProfileInit() { +#if !BUILDFLAG(IS_CHROMEOS_ASH) + // Needs to be called after we have chrome::DIR_USER_DATA and + // g_browser_process. This happens in PreCreateThreads. + // base::GetLinuxDistro() will initialize its value if needed. + base::ThreadPool::PostTask( + FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + base::BindOnce(base::IgnoreResult(&base::GetLinuxDistro))); +#endif - ChromeBrowserMainPartsPosix::PostCreateMainMessageLoop(); + ChromeBrowserMainPartsPosix::PreProfileInit(); } #if defined(USE_DBUS) && !defined(OS_CHROMEOS) diff --git a/chrome/browser/chrome_browser_main_linux.h b/chrome/browser/chrome_browser_main_linux.h index a8fcedf0cc2aea..c6d33b4a8964ba 100644 --- a/chrome/browser/chrome_browser_main_linux.h +++ b/chrome/browser/chrome_browser_main_linux.h @@ -20,9 +20,9 @@ class ChromeBrowserMainPartsLinux : public ChromeBrowserMainPartsPosix { ~ChromeBrowserMainPartsLinux() override; - // ChromeBrowserMainParts overrides. - void PreProfileInit() override; + // ChromeBrowserMainPartsPosix overrides. void PostCreateMainMessageLoop() override; + void PreProfileInit() override; #if defined(USE_DBUS) && !defined(OS_CHROMEOS) // Only needed for native Linux, to set up the low-memory-monitor-based memory // monitoring (which depends on D-Bus). diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 8a925641696f47..8c58a15bd07af2 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json @@ -567,6 +567,11 @@ "owners": [ "yudiliu", "chromeos-bluetooth@google.com" ], "expiry_milestone": 100 }, + { + "name": "bluetooth-use-floss", + "owners": ["sonnysasaka", "abhishekpandit", "chromeos-bluetooth@google.com"], + "expiry_milestone": 111 + }, { "name": "bluetooth-wbs-dogfood", "owners": [ "hychao" ], diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 64fbb67f8f0878..434579189e03bc 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc @@ -4151,6 +4151,12 @@ const char kBluetoothWbsDogfoodDescription[] = "or fully launched. Only on the few models that Bluetooth WBS is " "still stablizing this flag will take effect."; +const char kBluetoothUseFlossName[] = "Use Floss instead of BlueZ"; +const char kBluetoothUseFlossDescription[] = + "Enables using Floss (also known as Fluoride, Android's Bluetooth stack) " + "instead of Bluez. This is meant to be used by developers and is not " + "guaranteed to be stable"; + const char kButtonARCNetworkDiagnosticsName[] = "ARC Network Tests Button"; const char kButtonARCNetworkDiagnosticsDescription[] = "Enables the display of a button on the ARC Provisioning failure dialog " diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 0c8f014254cd84..2388d0a4a90a79 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h @@ -2392,6 +2392,9 @@ extern const char kBluetoothRevampDescription[]; extern const char kBluetoothWbsDogfoodName[]; extern const char kBluetoothWbsDogfoodDescription[]; +extern const char kBluetoothUseFlossName[]; +extern const char kBluetoothUseFlossDescription[]; + extern const char kButtonARCNetworkDiagnosticsName[]; extern const char kButtonARCNetworkDiagnosticsDescription[]; diff --git a/chrome/browser/language/android/BUILD.gn b/chrome/browser/language/android/BUILD.gn index e9ced467e3e60f..6811ae51b78bd1 100644 --- a/chrome/browser/language/android/BUILD.gn +++ b/chrome/browser/language/android/BUILD.gn @@ -51,6 +51,7 @@ android_library("java") { "//chrome/browser/settings:java", "//chrome/browser/tab:java", "//chrome/browser/ui/messages/android:java", + "//chrome/browser/util:java", "//components/browser_ui/settings/android:java", "//components/browser_ui/styles/android:java", "//components/browser_ui/widget/android:java", diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java index cc4809c4eafdd3..b8da7e249b7183 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java @@ -27,6 +27,7 @@ import org.chromium.chrome.browser.language.settings.LanguageItem; import org.chromium.chrome.browser.language.settings.LanguagesManager; import org.chromium.chrome.browser.translate.TranslateBridge; +import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.components.language.AndroidLanguageMetricsBridge; import org.chromium.components.language.GeoLanguageProviderBridge; import org.chromium.net.NetworkChangeNotifier; @@ -504,21 +505,22 @@ public static boolean maybeShowPrompt(Activity activity, * @return Whether the app language prompt should be shown or not. */ private static boolean shouldShowPrompt() { - boolean isOnline = NetworkChangeNotifier.isOnline(); - // This switch is only used for testing so it is ok to override all other checks. - if (ChromeFeatureList.isEnabled(ChromeFeatureList.FORCE_APP_LANGUAGE_PROMPT)) { - // Even if feature is set don't show prompt if offline for testing. - recordOnlineStatus(isOnline); - return isOnline; + // Skip feature and preference checks if forced on for testing. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.FORCE_APP_LANGUAGE_PROMPT)) { + // Don't show the prompt if not enabled. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.APP_LANGUAGE_PROMPT)) return false; + // Don't show the prompt if it has already been shown. + if (TranslateBridge.getAppLanguagePromptShown()) return false; } - // Don't show the prompt if not enabled or already shown. - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.APP_LANGUAGE_PROMPT)) return false; - if (TranslateBridge.getAppLanguagePromptShown()) return false; + boolean isAccessibilityEnabled = ChromeAccessibilityUtil.get().isAccessibilityEnabled(); + recordIsAccessibilityEnabled(isAccessibilityEnabled); - // Don't show the prompt if offline since a language pack download will fail. + boolean isOnline = NetworkChangeNotifier.isOnline(); recordOnlineStatus(isOnline); - return isOnline; + + // Only show the prompt if online and accessibility features are not enabled. + return isOnline && !isAccessibilityEnabled; } /** @@ -552,6 +554,12 @@ private static void recordOnlineStatus(boolean isOnline) { "LanguageSettings.AppLanguagePrompt.IsOnline", isOnline); } + private static void recordIsAccessibilityEnabled(boolean isAccessibilityEnabled) { + RecordHistogram.recordBooleanHistogram( + "LanguageSettings.AppLanguagePrompt.IsAccessibilityEnabled", + isAccessibilityEnabled); + } + private static void recordOpenDuration(String type, long displayTime) { RecordHistogram.recordLongTimesHistogram100( "LanguageSettings.AppLanguagePrompt.OpenDuration." + type, displayTime); diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index 47d3ffa9328b5f..068164417df231 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc @@ -573,27 +573,11 @@ void SystemNetworkContextManager::OnNetworkServiceCreated( // NetworkContext is created, but before anything has the chance to use it. stub_resolver_config_reader_.UpdateNetworkService(true /* record_metrics */); -#if defined(OS_LINUX) - const base::CommandLine& command_line = - *base::CommandLine::ForCurrentProcess(); - - // Set up crypt config. This should be kept in sync with the OSCrypt parts of - // ChromeBrowserMainPartsLinux::PreProfileInit. - network::mojom::CryptConfigPtr config = network::mojom::CryptConfig::New(); - config->store = command_line.GetSwitchValueASCII(switches::kPasswordStore); - config->product_name = l10n_util::GetStringUTF8(IDS_PRODUCT_NAME); - config->should_use_preference = - command_line.HasSwitch(switches::kEnableEncryptionSelection); - chrome::GetDefaultUserDataDirectory(&config->user_data_path); - network_service->SetCryptConfig(std::move(config)); -#endif -#if defined(OS_WIN) || defined(OS_MAC) // The OSCrypt keys are process bound, so if network service is out of // process, send it the required key. if (content::IsOutOfProcessNetworkService()) { network_service->SetEncryptionKey(OSCrypt::GetRawEncryptionKey()); } -#endif // Asynchronously reapply the most recently received CRLSet (if any). component_updater::CRLSetPolicy::ReconfigureAfterNetworkRestart(); diff --git a/chrome/browser/profile_resetter/profile_resetter_unittest.cc b/chrome/browser/profile_resetter/profile_resetter_unittest.cc index 54d31af4ea041a..8570efae5d6a9c 100644 --- a/chrome/browser/profile_resetter/profile_resetter_unittest.cc +++ b/chrome/browser/profile_resetter/profile_resetter_unittest.cc @@ -988,19 +988,19 @@ TEST_F(ProfileResetterTest, GetReadableFeedback) { bool checked_extensions = false; bool checked_shortcuts = false; for (size_t i = 0; i < list->GetList().size(); ++i) { - base::DictionaryValue* dict = NULL; - ASSERT_TRUE(list->GetDictionary(i, &dict)); - std::string value; - ASSERT_TRUE(dict->GetString("key", &value)); - if (value == "Extensions") { - std::u16string extensions; - EXPECT_TRUE(dict->GetString("value", &extensions)); - EXPECT_EQ(u"Tiësto", extensions); + const base::Value& dict = list->GetList()[i]; + ASSERT_TRUE(dict.is_dict()); + const std::string* value = dict.FindStringKey("key"); + ASSERT_TRUE(value); + if (*value == "Extensions") { + const std::string* extensions = dict.FindStringKey("value"); + ASSERT_TRUE(extensions); + EXPECT_EQ(*extensions, "Tiësto"); checked_extensions = true; - } else if (value == "Shortcut targets") { - std::u16string targets; - EXPECT_TRUE(dict->GetString("value", &targets)); - EXPECT_NE(std::u16string::npos, targets.find(u"foo.com")) << targets; + } else if (*value == "Shortcut targets") { + const std::string* targets = dict.FindStringKey("value"); + ASSERT_TRUE(targets); + EXPECT_NE(std::string::npos, targets->find("foo.com")) << *targets; checked_shortcuts = true; } } diff --git a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc index 8541d82a98fcc8..7c364d84bb9583 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc @@ -51,6 +51,8 @@ std::ostream& operator<<(std::ostream& out, return out << "kFeedbackDialog"; case ProfileKeepAliveOrigin::kWebAppUpdate: return out << "kWebAppUpdate"; + case ProfileKeepAliveOrigin::kGettingWebAppInfo: + return out << "kGettingWebAppInfo"; } NOTREACHED(); return out << static_cast(origin); diff --git a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h index 68cb8f3dbb494c..5a3148e359f11b 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h @@ -100,7 +100,11 @@ enum class ProfileKeepAliveOrigin { // A web app is being updated. kWebAppUpdate = 22, - kMaxValue = kWebAppUpdate, + // Getting web app info for this profile. This is specifically for handling + // --list-apps switch. + kGettingWebAppInfo = 23, + + kMaxValue = kGettingWebAppInfo, }; std::ostream& operator<<(std::ostream& out, diff --git a/chrome/browser/resources/pdf/OWNERS b/chrome/browser/resources/pdf/OWNERS index ef4a59d0a1f062..a806db94bc0869 100644 --- a/chrome/browser/resources/pdf/OWNERS +++ b/chrome/browser/resources/pdf/OWNERS @@ -1,3 +1,4 @@ dhoss@chromium.org dpapad@chromium.org +kmoon@chromium.org rbpotter@chromium.org diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js index 17e5ef5d7cb664..12a5adb4881b00 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js @@ -119,6 +119,7 @@ class SettingsBluetoothDeviceDetailSubpageElement extends currentRouteChanged(route) { if (route !== routes.BLUETOOTH_DEVICE_DETAIL) { this.deviceId_ = ''; + this.pageState_ = PageState.DISCONNECTED; return; } @@ -227,6 +228,12 @@ class SettingsBluetoothDeviceDetailSubpageElement extends } this.parentNode.pageTitle = getDeviceName(this.device_); + if (this.pageState_ === PageState.CONNECTION_FAILED && + this.device_.deviceProperties.connectionState === + mojom.DeviceConnectionState.kNotConnected) { + return; + } + switch (this.device_.deviceProperties.connectionState) { case mojom.DeviceConnectionState.kConnected: this.pageState_ = PageState.CONNECTED; diff --git a/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc index 8b3be0f87bb567..0da5979d24cd60 100644 --- a/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc +++ b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc @@ -75,6 +75,13 @@ void ChromeTailoredSecurityService::ShowSyncNotification(bool is_enabled) { content::WebContents* web_contents = GetWebContentsForProfile(profile_); if (!web_contents) return; + + // Since the Android UX is a notice, we simply enable Enhanced Protection + // here. + SetSafeBrowsingState(profile_->GetPrefs(), + SafeBrowsingState::ENHANCED_PROTECTION, + /*is_esb_enabled_in_sync=*/true); + message_ = std::make_unique(); message_->DisplayMessage( web_contents, is_enabled, diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc index 0b2c49e439fe8a..f8adb4008001c8 100644 --- a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc @@ -5,9 +5,13 @@ #include "chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.h" #include "chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "components/prefs/pref_service.h" #include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/signin/public/identity_manager/identity_manager.h" #include "content/public/browser/render_widget_host_view.h" #if defined(OS_ANDROID) @@ -57,9 +61,29 @@ void TailoredSecurityUrlObserver::OnTailoredSecurityBitChanged( base::Time previous_update) { Profile* profile = Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - if (enabled && !IsEnhancedProtectionEnabled(*profile->GetPrefs())) { - if (base::Time::Now() - previous_update <= - base::Minutes(kThresholdForInFlowNotificationMinutes)) { + if (!enabled || IsEnhancedProtectionEnabled(*profile->GetPrefs())) + return; + + // We should only trigger the unconsented UX if the user is not consented to + // sync. Syncing users have different UX, handled by the + // `ChromeTailoredSecurityService`. + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + if (!identity_manager || + identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) { + return; + } + + if (profile->GetPrefs()->GetBoolean( + prefs::kAccountTailoredSecurityShownNotification)) { + return; + } + + profile->GetPrefs()->SetBoolean( + prefs::kAccountTailoredSecurityShownNotification, true); + + if (base::Time::Now() - previous_update <= + base::Minutes(kThresholdForInFlowNotificationMinutes)) { #if defined(OS_ANDROID) message_ = std::make_unique( web_contents(), @@ -70,9 +94,17 @@ void TailoredSecurityUrlObserver::OnTailoredSecurityBitChanged( #else TailoredSecurityUnconsentedModal::ShowForWebContents(web_contents()); #endif - } else { - // TODO(drubery): Add out-of-flow UX here. - } + } else { +#if defined(OS_ANDROID) + message_ = std::make_unique( + web_contents(), + base::BindOnce(&TailoredSecurityUrlObserver::MessageDismissed, + // Unretained is safe because |this| owns |message_|. + base::Unretained(this)), + /*is_in_flow=*/false); +#else + DisplayTailoredSecurityUnconsentedPromotionNotification(profile); +#endif } } diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc index 47d5810fc75147..7f7d7023a304ec 100644 --- a/chrome/browser/ssl/ssl_browsertest.cc +++ b/chrome/browser/ssl/ssl_browsertest.cc @@ -2216,10 +2216,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, TestClientAuthContinueWithoutCert) { EXPECT_EQ("", tab->GetLastCommittedURL().ref()); } -// TODO(https://crbug.com/1279930): disabled because of race in when certs -// are incorporated. -IN_PROC_BROWSER_TEST_F(SSLUITest, - DISABLED_TestCertDBChangedFlushesClientAuthCache) { +IN_PROC_BROWSER_TEST_F(SSLUITest, TestCertDBChangedFlushesClientAuthCache) { // Make the browser use the ClientCertStoreStub instead of the regular one. ProfileNetworkContextServiceFactory::GetForContext(browser()->profile()) ->set_client_cert_store_factory_for_testing( @@ -2275,6 +2272,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, // Send a CertDBChanged notification. net::CertDatabase::GetInstance()->NotifyObserversCertDBChanged(); + content::FlushNetworkServiceInstanceForTesting(); // Visiting the page which requires client certs should fail, as the socket // pool has been flushed and SSL client auth cache has been cleared due to @@ -4099,15 +4097,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrors, TestWSS) { // --ignore-certificate-errors-spki-list. The connection should be established // without interstitial page showing. #if !BUILDFLAG(IS_CHROMEOS_ASH) // Chrome OS does not support the flag. -// TODO(crbug.com/1176880): Disabled on macOS because the WSS SpawnedTestServer -// does not support modern TLS on the macOS bots. -#if defined(OS_MAC) -#define MAYBE_TestWSSExpired DISABLED_TestWSSExpired -#else -#define MAYBE_TestWSSExpired TestWSSExpired -#endif -IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, - MAYBE_TestWSSExpired) { +IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, TestWSSExpired) { ASSERT_TRUE(wss_server_expired_.Start()); // Setup page title observer. diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc index 2865a95e2ed526..bdde0b323e66f5 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc @@ -1152,9 +1152,8 @@ TEST_P(MetadataDatabaseTest, DumpFiles) { TrackedFile folder_0(CreateTrackedFolder(app_root, "folder_0")); TrackedFile file_0(CreateTrackedFile(folder_0, "file_0")); - const TrackedFile* tracked_files[] = { - &sync_root, &app_root, &folder_0, &file_0 - }; + const TrackedFile* tracked_files[] = {&sync_root, &app_root, &folder_0, + &file_0}; SetUpDatabaseByTrackedFiles(tracked_files, base::size(tracked_files)); EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase()); @@ -1164,18 +1163,22 @@ TEST_P(MetadataDatabaseTest, DumpFiles) { metadata_database()->DumpFiles(app_root.tracker.app_id()); ASSERT_EQ(2u, files->GetList().size()); - base::DictionaryValue* file = nullptr; - std::string str; - - ASSERT_TRUE(files->GetDictionary(0, &file)); - EXPECT_TRUE(file->GetString("title", &str) && str == "folder_0"); - EXPECT_TRUE(file->GetString("type", &str) && str == "folder"); - EXPECT_TRUE(file->HasKey("details")); - - ASSERT_TRUE(files->GetDictionary(1, &file)); - EXPECT_TRUE(file->GetString("title", &str) && str == "file_0"); - EXPECT_TRUE(file->GetString("type", &str) && str == "file"); - EXPECT_TRUE(file->HasKey("details")); + const std::string* str; + const base::Value& folder = files->GetList()[0]; + ASSERT_TRUE(folder.is_dict()); + str = folder.FindStringKey("title"); + EXPECT_TRUE(str && *str == "folder_0"); + str = folder.FindStringKey("type"); + EXPECT_TRUE(str && *str == "folder"); + EXPECT_TRUE(folder.FindKey("details")); + + const base::Value& file = files->GetList()[1]; + ASSERT_TRUE(file.is_dict()); + str = file.FindStringKey("title"); + EXPECT_TRUE(str && *str == "file_0"); + str = file.FindStringKey("type"); + EXPECT_TRUE(str && *str == "file"); + EXPECT_TRUE(file.FindKey("details")); } TEST_P(MetadataDatabaseTest, ClearDatabase) { diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 124789636aef12..d717f628b74d4d 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn @@ -1524,8 +1524,6 @@ static_library("ui") { "webui/new_tab_page_third_party/new_tab_page_third_party_ui.h", "webui/ntp/app_icon_webui_handler.cc", "webui/ntp/app_icon_webui_handler.h", - "webui/ntp/app_launcher_handler.cc", - "webui/ntp/app_launcher_handler.h", "webui/ntp/app_resource_cache_factory.cc", "webui/ntp/app_resource_cache_factory.h", "webui/ntp/cookie_controls_handler.cc", @@ -3262,6 +3260,8 @@ static_library("ui") { "webui/app_launcher_page_ui.h", "webui/browser_switch/browser_switch_ui.cc", "webui/browser_switch/browser_switch_ui.h", + "webui/ntp/app_launcher_handler.cc", + "webui/ntp/app_launcher_handler.h", ] } @@ -3813,6 +3813,8 @@ static_library("ui") { if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { sources += [ + "startup/web_app_info_recorder_utils.cc", + "startup/web_app_info_recorder_utils.h", "startup/web_app_url_handling_startup_utils.cc", "startup/web_app_url_handling_startup_utils.h", "webui/settings/url_handlers_handler.cc", diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index 48806cfa383760..609ecb56d7bd67 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java @@ -55,7 +55,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.native_page.NativePage; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; @@ -73,6 +72,7 @@ import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.interpolators.BakedBezierInterpolator; +import org.chromium.ui.util.ColorUtils; import java.util.ArrayList; import java.util.List; @@ -928,18 +928,22 @@ private void focusCurrentTab() { */ @VisibleForTesting /* package */ void updateBrandedColorScheme() { + // TODO(crbug.com/1114183): Unify light and dark color logic in chrome and make it clear + // whether the foreground or background color is dark. + final boolean useDarkForegroundColors = + !ColorUtils.shouldUseLightForegroundOnBackground(getPrimaryBackgroundColor()); final @BrandedColorScheme int brandedColorScheme = OmniboxResourceProvider.getBrandedColorScheme(mContext, mLocationBarDataProvider.isIncognito(), getPrimaryBackgroundColor()); mLocationBarLayout.setDeleteButtonTint( - ThemeUtils.getThemedToolbarIconTint(mContext, brandedColorScheme)); + ChromeColors.getPrimaryIconTint(mContext, !useDarkForegroundColors)); // If the URL changed colors and is not focused, update the URL to account for the new // color scheme. if (mUrlCoordinator.setBrandedColorScheme(brandedColorScheme) && !isUrlBarFocused()) { updateUrl(); } - mStatusCoordinator.setBrandedColorScheme(brandedColorScheme); + mStatusCoordinator.setUseDarkForegroundColors(useDarkForegroundColors); if (mAutocompleteCoordinator != null) { mAutocompleteCoordinator.updateVisualsForState(brandedColorScheme); } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index 0748d771bc6fb4..4635ff07a672ea 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java @@ -666,7 +666,7 @@ public void testUpdateColors_lightBrandedColor() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.LIGHT_BRANDED_THEME); + verify(mStatusCoordinator).setUseDarkForegroundColors(true); verify(mAutocompleteCoordinator) .updateVisualsForState(BrandedColorScheme.LIGHT_BRANDED_THEME); } @@ -679,7 +679,7 @@ public void testUpdateColors_darkBrandedColor() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + verify(mStatusCoordinator).setUseDarkForegroundColors(false); verify(mAutocompleteCoordinator) .updateVisualsForState(BrandedColorScheme.DARK_BRANDED_THEME); } @@ -693,7 +693,7 @@ public void testUpdateColors_incognito() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.INCOGNITO); + verify(mStatusCoordinator).setUseDarkForegroundColors(false); verify(mAutocompleteCoordinator).updateVisualsForState(BrandedColorScheme.INCOGNITO); } @@ -706,7 +706,7 @@ public void testUpdateColors_default() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.APP_DEFAULT); + verify(mStatusCoordinator).setUseDarkForegroundColors(true); verify(mAutocompleteCoordinator).updateVisualsForState(BrandedColorScheme.APP_DEFAULT); } @@ -723,7 +723,7 @@ public void testUpdateColors_setColorScheme() { verify(mUrlCoordinator) .setUrlBarData( urlBarData, UrlBar.ScrollType.SCROLL_TO_TLD, SelectionState.SELECT_ALL); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + verify(mStatusCoordinator).setUseDarkForegroundColors(false); verify(mAutocompleteCoordinator) .updateVisualsForState(BrandedColorScheme.DARK_BRANDED_THEME); } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java index 5dc42d16ec0fd6..b7c95de9eecab6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java @@ -23,7 +23,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.search_engines.TemplateUrlService; @@ -146,15 +145,14 @@ public static int getSearchEngineLogoComposedSizePixels(@NonNull Resources resou * circumstances, such as: no logo url found, network/cache error, etc. * * @param resources Provides access to Android resources. - * @param brandedColorScheme The {@link BrandedColorScheme}, used to tint icons. + * @param inNightMode Whether the device is currently in night mode, used to tint icons. * @param profile The current profile. When null, falls back to locally-provided icons. * @param templateUrlService The current templateUrlService. When null, falls back to * locally-provided icons. * @param callback How the bitmap will be returned to the caller. */ - public void getSearchEngineLogo(@NonNull Resources resources, - @BrandedColorScheme int brandedColorScheme, @Nullable Profile profile, - @Nullable TemplateUrlService templateUrlService, + public void getSearchEngineLogo(@NonNull Resources resources, boolean inNightMode, + @Nullable Profile profile, @Nullable TemplateUrlService templateUrlService, @NonNull Callback callback) { // In the following cases, we fallback to the search loupe: // - Either of the nullable dependencies are null. @@ -164,7 +162,7 @@ public void getSearchEngineLogo(@NonNull Resources resources, // then we serve the Google icon we have locally. // Otherwise, the search engine is non-Google and we go to the network to fetch it. if (profile == null || templateUrlService == null || needToCheckForSearchEnginePromo()) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); return; } else if (templateUrlService.isDefaultSearchEngineGoogle()) { callback.onResult(new StatusIconResource(R.drawable.ic_logo_googleg_20dp, 0)); @@ -178,7 +176,7 @@ public void getSearchEngineLogo(@NonNull Resources resources, String logoUrl = getSearchLogoUrl(templateUrlService); if (logoUrl == null) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); recordEvent(Events.FETCH_FAILED_NULL_URL); return; } @@ -194,7 +192,7 @@ public void getSearchEngineLogo(@NonNull Resources resources, boolean willCallbackBeCalled = mFaviconHelper.getLocalFaviconImageForURL( profile, logoUrl, logoSizePixels, (image, iconUrl) -> { if (image == null) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); recordEvent(Events.FETCH_FAILED_RETURNED_BITMAP_NULL); return; } @@ -203,15 +201,16 @@ public void getSearchEngineLogo(@NonNull Resources resources, recordEvent(Events.FETCH_SUCCESS); }); if (!willCallbackBeCalled) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); recordEvent(Events.FETCH_FAILED_FAVICON_HELPER_ERROR); } } @VisibleForTesting - StatusIconResource getSearchLoupeResource(@BrandedColorScheme int brandedColorScheme) { - return new StatusIconResource( - R.drawable.ic_search, ThemeUtils.getThemedToolbarIconTintRes(brandedColorScheme)); + StatusIconResource getSearchLoupeResource(boolean inNightMode) { + return new StatusIconResource(R.drawable.ic_search, + inNightMode ? R.color.default_icon_color_secondary_tint_list + : ThemeUtils.getThemedToolbarIconTintRes(/* useLight= */ true)); } /** Returns whether the search engine promo is complete. */ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java index 719b406b0e73f6..21d28d3f29b912 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java @@ -48,7 +48,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.search_engines.TemplateUrlService; @@ -136,7 +135,7 @@ public void getSearchEngineLogo() { StatusIconResource expected = new StatusIconResource(LOGO_URL, mBitmap, 0); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mFaviconHelper) .getLocalFaviconImageForURL( @@ -156,12 +155,12 @@ public void getSearchEngineLogo() { @Test public void getSearchEngineLogo_nullProfileOrTemplateUrlService() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, null, mTemplateUrlService, mCallback); + /* inNightMode= */ false, null, mTemplateUrlService, mCallback); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), null, mCallback); + /* inNightMode= */ false, Mockito.mock(Profile.class), null, mCallback); verify(mCallback, times(2)).onResult(expected); } @@ -172,7 +171,7 @@ public void getSearchEngineLogo_searchEngineGoogle() { doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback).onResult(expected); } @@ -182,7 +181,7 @@ public void getSearchEngineLogo_faviconCached() { StatusIconResource expected = new StatusIconResource(LOGO_URL, mBitmap, 0); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mFaviconHelper) .getLocalFaviconImageForURL( @@ -190,7 +189,7 @@ public void getSearchEngineLogo_faviconCached() { FaviconHelper.FaviconImageCallback faviconCallback = mCallbackCaptor.getValue(); faviconCallback.onFaviconAvailable(mBitmap, JUnitTestGURLs.getGURL(LOGO_URL)); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback, times(2)).onResult(expected); @@ -208,11 +207,11 @@ public void getSearchEngineLogo_faviconCached() { @Test public void getSearchEngineLogo_nullUrl() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); doReturn(null).when(mTemplateUrlService).getUrlForSearchQuery(any()); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback).onResult(eq(expected)); @@ -227,14 +226,14 @@ public void getSearchEngineLogo_nullUrl() { @Test public void getSearchEngineLogo_faviconHelperError() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); when(mFaviconHelper.getLocalFaviconImageForURL( any(), anyString(), anyInt(), mCallbackCaptor.capture())) .thenReturn(false); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback).onResult(expected); @@ -249,10 +248,10 @@ public void getSearchEngineLogo_faviconHelperError() { @Test public void getSearchEngineLogo_returnedBitmapNull() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mFaviconHelper) .getLocalFaviconImageForURL( @@ -272,15 +271,14 @@ public void getSearchEngineLogo_returnedBitmapNull() { @Test public void getSearchLoupeResource() { StatusIconResource expected = new StatusIconResource( - R.drawable.ic_search, R.color.default_icon_color_white_tint_list); - Assert.assertEquals(expected, - mSearchEngineLogoUtils.getSearchLoupeResource( - BrandedColorScheme.DARK_BRANDED_THEME)); + R.drawable.ic_search, R.color.default_icon_color_secondary_tint_list); + Assert.assertEquals( + expected, mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ true)); expected = new StatusIconResource( R.drawable.ic_search, ThemeUtils.getThemedToolbarIconTintRes(/* useLight */ true)); - Assert.assertEquals(expected, - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.INCOGNITO)); + Assert.assertEquals( + expected, mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false)); } @Test diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java index 9d807efeb62c5c..6e94f520262340 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java @@ -26,7 +26,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.user_education.IPHCommandBuilder; import org.chromium.chrome.browser.user_education.UserEducationHelper; import org.chromium.components.embedder_support.util.UrlConstants; @@ -171,10 +170,11 @@ public void setUrlFocusChangePercent(float percent) { } /** - * @param brandedColorScheme The {@link BrandedColorScheme} to use for the status icon and text. + * @param useDarkForegroundColors Whether dark foreground colors should be for the status icon + * and text. */ - public void setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { - mMediator.setBrandedColorScheme(brandedColorScheme); + public void setUseDarkForegroundColors(boolean useDarkForegroundColors) { + mMediator.setUseDarkColors(useDarkForegroundColors); // TODO(ender): remove this once icon selection has complete set of // corresponding properties (for tinting etc). diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java index b656a95f2c0d9f..bc9800fcf68d60 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java @@ -29,11 +29,9 @@ import org.chromium.chrome.browser.omnibox.status.StatusProperties.PermissionIconResource; import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconResource; import org.chromium.chrome.browser.omnibox.status.StatusView.IconTransitionType; -import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; import org.chromium.chrome.browser.page_info.ChromePageInfoHighlight; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.theme.ThemeUtils; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.site_settings.ContentSettingsResources; import org.chromium.components.browser_ui.site_settings.SiteSettingsUtil; import org.chromium.components.content_settings.ContentSettingValues; @@ -63,6 +61,7 @@ public class StatusMediator implements PermissionDialogController.Observer, private final Supplier mProfileSupplier; private final Supplier mMerchantTrustSignalsCoordinatorSupplier; + private boolean mDarkTheme; private boolean mUrlHasFocus; private boolean mVerboseStatusSpaceAvailable; private boolean mPageIsPaintPreview; @@ -79,7 +78,6 @@ public class StatusMediator implements PermissionDialogController.Observer, private @ConnectionSecurityLevel int mPageSecurityLevel; - private @BrandedColorScheme int mBrandedColorScheme; private @DrawableRes int mSecurityIconRes; private @DrawableRes int mSecurityIconTintRes; private @StringRes int mSecurityIconDescriptionRes; @@ -391,11 +389,11 @@ void setUrlMinWidth(int width) { } /** - * Set the {@link BrandedColorScheme}. + * Toggle between dark and light UI color theme. */ - void setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { - if (mBrandedColorScheme != brandedColorScheme) { - mBrandedColorScheme = brandedColorScheme; + void setUseDarkColors(boolean useDarkColors) { + if (mDarkTheme != useDarkColors) { + mDarkTheme = useDarkColors; updateColorTheme(); } } @@ -437,24 +435,22 @@ private void updateVerbaseStatusTextVisibility() { * Update color theme for all status components. */ private void updateColorTheme() { - // TODO(https://crbug.com/1275726): Update the colors here once we have the specs. - final boolean isDark = !OmniboxResourceProvider.isDarkMode(mBrandedColorScheme); @ColorRes - int separatorColor = - isDark ? R.color.divider_line_bg_color_dark : R.color.divider_line_bg_color_light; + int separatorColor = mDarkTheme ? R.color.divider_line_bg_color_dark + : R.color.divider_line_bg_color_light; @ColorRes int textColor = 0; if (mPageIsPaintPreview) { - textColor = isDark ? R.color.locationbar_status_preview_color - : R.color.locationbar_status_preview_color_light; + textColor = mDarkTheme ? R.color.locationbar_status_preview_color + : R.color.locationbar_status_preview_color_light; } else if (mPageIsOffline) { - textColor = isDark ? R.color.locationbar_status_offline_color - : R.color.locationbar_status_offline_color_light; + textColor = mDarkTheme ? R.color.locationbar_status_offline_color + : R.color.locationbar_status_offline_color_light; } @ColorRes - int tintColor = ThemeUtils.getThemedToolbarIconTintRes(mBrandedColorScheme); + int tintColor = ThemeUtils.getThemedToolbarIconTintRes(!mDarkTheme); mModel.set(StatusProperties.SEPARATOR_COLOR_RES, separatorColor); mNavigationIconTintRes = tintColor; @@ -581,9 +577,9 @@ private void getStatusIconResourceForSearchEngineIcon( // If the current url text is a valid url, then swap the dse icon for a globe. if (!mUrlBarTextIsSearch) { resourceCallback.onResult(new StatusIconResource(R.drawable.ic_globe_24dp, - ThemeUtils.getThemedToolbarIconTintRes(mBrandedColorScheme))); + ThemeUtils.getThemedToolbarIconTintRes(/* useLight= */ !mDarkTheme))); } else { - mSearchEngineLogoUtils.getSearchEngineLogo(mResources, mBrandedColorScheme, + mSearchEngineLogoUtils.getSearchEngineLogo(mResources, mDarkTheme, mProfileSupplier.get(), mTemplateUrlServiceSupplier.get(), resourceCallback); } } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java index bf2c89ee14fdde..d986081c734327 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java @@ -300,8 +300,8 @@ public void updateSuggestionListLayoutDirection() { * Update the visuals of the autocomplete UI. * @param brandedColorScheme The {@link @BrandedColorScheme}. */ - public void updateVisualsForState(@BrandedColorScheme int brandedColorScheme) { - mMediator.updateVisualsForState(brandedColorScheme); + public void updateVisualsForState(@BrandedColorScheme int colorScheme) { + mMediator.updateVisualsForState(colorScheme); } /** diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index bfc87f9529cfe7..7f1f4cf37ce710 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb @@ -1429,7 +1429,7 @@ Jotkin verkkosivustot voivat vastata tähän pyyntöön esimerkiksi näyttämäl Ota synkronointi käyttöön, niin voit jakaa sisältöä laitteiden välillä Ilmoitukset sallitaan. Sijainti on poissa käytöstä tällä laitteella. {FILE_COUNT,plural, =1{# video}other{# videota}} -Tietosuoja ja turvallisuus +Yksityisyys ja turvallisuus Tunnuslause Poista käytöstä Käytä tietokoneversiota Muokkaa diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index ce2a0380b767d3..4e0726cf276d17 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb @@ -1295,7 +1295,7 @@ Piemēram, dažas vietnes, reaģējot uz šo pieprasījumu, var rādīt jums rek Skatīt lejupielādes Izlaist Tumšā motīva lietošana vietnēs, kad iespējams -Paraksti +Subtitri Notiek savienojuma izveide ar jūsu ierīci… Standarta cilnes Pašlaik atvērtā tīmekļa vietne tiek pievienota to tīmekļa vietņu sarakstam, kurām sekojat. diff --git a/chrome/browser/ui/android/theme/BUILD.gn b/chrome/browser/ui/android/theme/BUILD.gn index 226babee32dab0..36e61e785c0f23 100644 --- a/chrome/browser/ui/android/theme/BUILD.gn +++ b/chrome/browser/ui/android/theme/BUILD.gn @@ -50,6 +50,7 @@ android_library("delegate_public_impl_java") { android_resources("java_resources") { sources = [ + "java/res/color/toolbar_icon_tint_dark.xml", "java/res/values/colors.xml", "java/res/values/values.xml", ] diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_dark_tint_list.xml b/chrome/browser/ui/android/theme/java/res/color/toolbar_icon_tint_dark.xml similarity index 100% rename from components/browser_ui/styles/android/java/res/color/default_icon_color_dark_tint_list.xml rename to chrome/browser/ui/android/theme/java/res/color/toolbar_icon_tint_dark.xml diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java index e799b13de9f6a1..1da27f15a04849 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java @@ -8,11 +8,10 @@ import android.content.res.ColorStateList; import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.chromium.base.ObserverList; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; +import org.chromium.ui.util.ColorUtils; /** * An abstract class that provides the current theme color. @@ -35,19 +34,25 @@ public interface ThemeColorObserver { public interface TintObserver { /** * @param tint The new tint the observer should use. - * @param brandedColorScheme The {@link BrandedColorScheme} the observer should use. + * @param useLight Whether the observer should use light mode. */ - void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme); + void onTintChanged(ColorStateList tint, boolean useLight); } + /** Light mode tint (used when color is dark). */ + private final ColorStateList mLightModeTint; + + /** Dark mode tint (used when color is light). */ + private final ColorStateList mDarkModeTint; + /** Current primary color. */ private int mPrimaryColor; - /** The current {@link BrandedColorScheme}. */ - private @Nullable @BrandedColorScheme Integer mBrandedColorScheme; - - /** The current tint. */ - private ColorStateList mTint; + /** + * Whether should use light tint (corresponds to dark color). If null, the state is not + * initialized. + */ + private @Nullable Boolean mUseLightTint; /** List of {@link ThemeColorObserver}s. These are used to broadcast events to listeners. */ private final ObserverList mThemeColorObservers; @@ -61,7 +66,8 @@ public interface TintObserver { public ThemeColorProvider(Context context) { mThemeColorObservers = new ObserverList(); mTintObservers = new ObserverList(); - mTint = ThemeUtils.getThemedToolbarIconTint(context, BrandedColorScheme.APP_DEFAULT); + mLightModeTint = ThemeUtils.getThemedToolbarIconTint(context, true); + mDarkModeTint = ThemeUtils.getThemedToolbarIconTint(context, false); } /** @@ -106,14 +112,14 @@ public int getThemeColor() { * @return The current tint of this provider. */ public ColorStateList getTint() { - return mTint; + return useLight() ? mLightModeTint : mDarkModeTint; } /** - * @return The current {@link BrandedColorScheme} of this provider. + * @return Whether or not this provider is using light tints. */ - public @BrandedColorScheme int getBrandedColorScheme() { - return mBrandedColorScheme != null ? mBrandedColorScheme : BrandedColorScheme.APP_DEFAULT; + public boolean useLight() { + return mUseLightTint != null ? mUseLightTint : false; } /** @@ -130,16 +136,16 @@ protected void updatePrimaryColor(int color, boolean shouldAnimate) { for (ThemeColorObserver observer : mThemeColorObservers) { observer.onThemeColorChanged(color, shouldAnimate); } + updateTint(); } - protected void updateTint( - @NonNull ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { - if (tint == mTint) return; - mTint = tint; - mBrandedColorScheme = brandedColorScheme; - + private void updateTint() { + final boolean useLight = ColorUtils.shouldUseLightForegroundOnBackground(mPrimaryColor); + if (mUseLightTint != null && useLight == mUseLightTint) return; + mUseLightTint = useLight; + final ColorStateList tint = useLight ? mLightModeTint : mDarkModeTint; for (TintObserver observer : mTintObservers) { - observer.onTintChanged(tint, brandedColorScheme); + observer.onTintChanged(tint, useLight); } } } diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java index a2ba90a88cba02..8ef7b430200eed 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java @@ -22,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.ui.native_page.NativePage; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.content_public.browser.RenderWidgetHostView; import org.chromium.content_public.browser.WebContents; @@ -130,40 +129,7 @@ public static ColorStateList getThemedToolbarIconTint(Context context, boolean u // Light toolbar theme colors may be used in night mode, so use toolbar_icon_tint_dark which // is not overridden in night- resources. return useLight ? R.color.default_icon_color_light_tint_list - : R.color.default_icon_color_dark_tint_list; - } - - /** - * Returns the themed toolbar icon tint list. - * - * @param context The context to retrieve the resources from. - * @param brandedColorScheme The {@link BrandedColorScheme}. - * @return Primary icon tint list. - */ - public static ColorStateList getThemedToolbarIconTint( - Context context, @BrandedColorScheme int brandedColorScheme) { - return AppCompatResources.getColorStateList( - context, getThemedToolbarIconTintRes(brandedColorScheme)); - } - - /** - * Returns the themed toolbar icon tint resource. - * - * @param brandedColorScheme The {@link BrandedColorScheme}. - * @return Primary icon tint resource. - */ - public static @ColorRes int getThemedToolbarIconTintRes( - @BrandedColorScheme int brandedColorScheme) { - @ColorRes - int colorId = R.color.default_icon_color_tint_list; - if (brandedColorScheme == BrandedColorScheme.INCOGNITO) { - colorId = R.color.default_icon_color_light_tint_list; - } else if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { - colorId = R.color.default_icon_color_dark_tint_list; - } else if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME) { - colorId = R.color.default_icon_color_white_tint_list; - } - return colorId; + : R.color.toolbar_icon_tint_dark; } /** diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java index d6481ba93acf3e..60d506a6527635 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java @@ -5,7 +5,6 @@ package org.chromium.chrome.browser.theme; import android.content.Context; -import android.content.res.ColorStateList; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -18,7 +17,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.ui.native_page.NativePage; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.ui.util.ColorUtils; @@ -105,21 +103,6 @@ public int getThemeColorOrFallback(Tab tab, int fallbackColor) { private void updateColor(Tab tab, int themeColor, boolean shouldAnimate) { updatePrimaryColor(calculateColor(tab, themeColor), shouldAnimate); mIsDefaultColorUsed = isUsingDefaultColor(tab, themeColor); - final @BrandedColorScheme int brandedColorScheme = - calculateBrandedColorScheme(tab.isIncognito(), mIsDefaultColorUsed); - final ColorStateList iconTint = - ThemeUtils.getThemedToolbarIconTint(mContext, brandedColorScheme); - updateTint(iconTint, brandedColorScheme); - } - - private int calculateBrandedColorScheme(boolean isIncognito, boolean isDefaultColor) { - if (isIncognito) return BrandedColorScheme.INCOGNITO; - if (isDefaultColor) return BrandedColorScheme.APP_DEFAULT; - - final boolean isDarkTheme = - ColorUtils.shouldUseLightForegroundOnBackground(getThemeColor()); - return isDarkTheme ? BrandedColorScheme.DARK_BRANDED_THEME - : BrandedColorScheme.LIGHT_BRANDED_THEME; } /** diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn index 0231a777ef90b1..8d56518bb52c50 100644 --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn @@ -237,10 +237,8 @@ android_resources("java_resources") { "java/res/layout/tab_switcher_toolbar.xml", "java/res/layout/toolbar_phone.xml", "java/res/layout/toolbar_tablet.xml", - "java/res/values-night/drawables.xml", "java/res/values-sw600dp/dimens.xml", "java/res/values/dimens.xml", - "java/res/values/drawables.xml", "java/res/values/ids.xml", "java/res/values/styles.xml", "java/res/values/values.xml", diff --git a/chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml b/chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml deleted file mode 100644 index 5b4031d7e30fd4..00000000000000 --- a/chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - @drawable/badge_update_light - @drawable/ic_error_white_24dp_filled - diff --git a/chrome/browser/ui/android/toolbar/java/res/values/drawables.xml b/chrome/browser/ui/android/toolbar/java/res/values/drawables.xml deleted file mode 100644 index 4539df5d7ce274..00000000000000 --- a/chrome/browser/ui/android/toolbar/java/res/values/drawables.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - @drawable/badge_update_dark - @drawable/ic_error_grey800_24dp_filled - diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java index 4784bb4f9eaee5..d0cdbfc1d41970 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java @@ -5,10 +5,8 @@ package org.chromium.chrome.browser.toolbar; import android.content.Context; -import android.content.res.ColorStateList; import org.chromium.chrome.browser.theme.ThemeColorProvider; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; /** * {@link ThemeColorProvider} that blindly tracks whatever primary color it's set to. @@ -30,11 +28,4 @@ public SettableThemeColorProvider(Context context) { public void setPrimaryColor(int color, boolean shouldAnimate) { updatePrimaryColor(color, shouldAnimate); } - - /** - * Sets the tint to the specified value. - */ - public void setTint(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { - updateTint(tint, brandedColorScheme); - } } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java index 2f3eb0f16d150b..2479bc7859975c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java @@ -10,7 +10,6 @@ import org.chromium.chrome.browser.theme.ThemeColorProvider; import org.chromium.chrome.browser.theme.ThemeColorProvider.TintObserver; import org.chromium.chrome.browser.toolbar.TabCountProvider.TabCountObserver; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -54,8 +53,7 @@ public void setThemeColorProvider(ThemeColorProvider themeColorProvider) { mThemeColorProvider = themeColorProvider; mTintObserver = new TintObserver() { @Override - public void onTintChanged( - ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { mTabSwitcherButtonModel.set(TabSwitcherButtonProperties.TINT, tint); } }; diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java index 0a74b3226f9500..1d43cc55bd7519 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java @@ -31,7 +31,6 @@ import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.toolbar.R; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.components.browser_ui.widget.highlight.PulseDrawable; import org.chromium.ui.interpolators.BakedBezierInterpolator; @@ -45,7 +44,7 @@ public class MenuButton extends FrameLayout implements TintObserver { /** The view for the update badge. */ private ImageView mUpdateBadgeView; - private @BrandedColorScheme int mBrandedColorScheme; + private boolean mUseLightDrawables; private AppMenuButtonHelper mAppMenuButtonHelper; @@ -122,7 +121,7 @@ private void updateImageResources() { mMenuImageButton.getWidth() - mMenuImageButton.getPaddingRight(), mMenuImageButton.getHeight() - mMenuImageButton.getPaddingBottom()); mMenuImageButtonAnimationDrawable.setGravity(Gravity.CENTER); - int color = ThemeUtils.getThemedToolbarIconTint(getContext(), mBrandedColorScheme) + int color = ThemeUtils.getThemedToolbarIconTint(getContext(), mUseLightDrawables) .getDefaultColor(); mMenuImageButtonAnimationDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); @@ -131,7 +130,7 @@ private void updateImageResources() { MenuButtonState buttonState = mStateSupplier.get(); if (buttonState == null || mUpdateBadgeView == null) return; @DrawableRes - int drawable = getUpdateBadgeIcon(buttonState, mBrandedColorScheme); + int drawable = mUseLightDrawables ? buttonState.lightBadgeIcon : buttonState.darkBadgeIcon; mUpdateBadgeView.setImageDrawable( ApiCompatibilityUtils.getDrawable(getResources(), drawable)); mUpdateBadgeAnimationDrawable = (BitmapDrawable) mUpdateBadgeView.getDrawable() @@ -145,19 +144,6 @@ private void updateImageResources() { mUpdateBadgeAnimationDrawable.setGravity(Gravity.CENTER); } - private @DrawableRes int getUpdateBadgeIcon( - MenuButtonState buttonState, @BrandedColorScheme int brandedColorScheme) { - @DrawableRes - int drawable = buttonState.adaptiveBadgeIcon; - if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME - || brandedColorScheme == BrandedColorScheme.INCOGNITO) { - drawable = buttonState.lightBadgeIcon; - } else if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { - drawable = buttonState.darkBadgeIcon; - } - return drawable; - } - /** * Set the supplier of menu button state. * @param supplier Supplier of menu button state. @@ -275,10 +261,7 @@ private void updateMenuButtonHighlightDrawable() { ViewCompat.getPaddingEnd(mMenuImageButton), mMenuImageButton.getPaddingBottom()); } - // TODO(https://crbug.com/1233703) This doesn't work well with website themes. - boolean isLightPulseColor = mBrandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME - || mBrandedColorScheme == BrandedColorScheme.INCOGNITO; - mHighlightDrawable.setUseLightPulseColor(getContext(), isLightPulseColor); + mHighlightDrawable.setUseLightPulseColor(getContext(), mUseLightDrawables); setBackground(mHighlightDrawable); mHighlightDrawable.start(); } else { @@ -304,14 +287,14 @@ public void drawTabSwitcherAnimationOverlay(Canvas canvas, int alpha) { } @VisibleForTesting - public @BrandedColorScheme int getBrandedColorSchemeForTesting() { - return mBrandedColorScheme; + public boolean getUseLightDrawablesForTesting() { + return mUseLightDrawables; } @Override - public void onTintChanged(ColorStateList tintList, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tintList, boolean useLight) { ApiCompatibilityUtils.setImageTintList(mMenuImageButton, tintList); - mBrandedColorScheme = brandedColorScheme; + mUseLightDrawables = useLight; updateImageResources(); updateMenuButtonHighlightDrawable(); } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java index de7646d221a982..105fdd2985e4a1 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java @@ -77,7 +77,7 @@ public MenuButtonCoordinator(OneshotSupplier appMenuCoordina new ShowBadgeProperty(false, false)) .with(MenuButtonProperties.THEME, new ThemeProperty(themeColorProvider.getTint(), - themeColorProvider.getBrandedColorScheme())) + themeColorProvider.useLight())) .with(MenuButtonProperties.IS_VISIBLE, true) .with(MenuButtonProperties.STATE_SUPPLIER, menuButtonStateSupplier) .build(); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java index 46094d764d8548..4c13daafeb45ed 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java @@ -32,7 +32,6 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.appmenu.AppMenuObserver; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; @@ -232,10 +231,8 @@ private void removeAppMenuUpdateBadge(boolean animate) { updateContentDescription(false, 0); } - private void onTintChanged( - ColorStateList tintList, @BrandedColorScheme int brandedColorScheme) { - mPropertyModel.set( - MenuButtonProperties.THEME, new ThemeProperty(tintList, brandedColorScheme)); + private void onTintChanged(ColorStateList tintList, boolean useLight) { + mPropertyModel.set(MenuButtonProperties.THEME, new ThemeProperty(tintList, useLight)); } /** diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java index 504a8c8194760a..f8f5d61553f177 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java @@ -88,7 +88,7 @@ public void setUp() { new ShowBadgeProperty(false, false)) .with(MenuButtonProperties.THEME, new ThemeProperty(mThemeColorProvider.getTint(), - mThemeColorProvider.getBrandedColorScheme())) + mThemeColorProvider.useLight())) .with(MenuButtonProperties.IS_VISIBLE, true) .build(); doReturn(mAppMenuHandler).when(mAppMenuCoordinator).getAppMenuHandler(); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java index de41381a6334f9..5c652127721c3c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java @@ -10,7 +10,6 @@ import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableFloatPropertyKey; @@ -20,12 +19,11 @@ class MenuButtonProperties { static class ThemeProperty { @NonNull public ColorStateList mColorStateList; - public @BrandedColorScheme int mBrandedColorScheme; + public boolean mUseLightColors; - public ThemeProperty(@NonNull ColorStateList colorStateList, - @BrandedColorScheme int brandedColorScheme) { + public ThemeProperty(@NonNull ColorStateList colorStateList, boolean useLight) { mColorStateList = colorStateList; - mBrandedColorScheme = brandedColorScheme; + mUseLightColors = useLight; } } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java index e9d2803f3c7ef4..ca15f979eda1ab 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java @@ -26,10 +26,4 @@ public class MenuButtonState { * this object is not {@code null}. */ public @DrawableRes int lightBadgeIcon; - - /** - * An icon resource for the badge for the menu button that adapts to light and dark modes. - * Always set (not {@code 0}) if this object is not {@code null}. - */ - public @DrawableRes int adaptiveBadgeIcon; } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java index 171746226d55e6..a336e62e5203d2 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java @@ -35,7 +35,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.toolbar.R; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; /** * Unit tests for MenuButton. @@ -65,7 +64,6 @@ R.layout.menu_button, new LinearLayout(mActivity))) R.string.accessibility_toolbar_btn_menu_update; mMenuUiState.buttonState.darkBadgeIcon = R.drawable.badge_update_dark; mMenuUiState.buttonState.lightBadgeIcon = R.drawable.badge_update_light; - mMenuUiState.buttonState.adaptiveBadgeIcon = R.drawable.badge_update; mMenuButton.setStateSupplier(() -> mMenuUiState.buttonState); } @@ -96,7 +94,7 @@ public void testDrawTabSwitcherAnimationOverlay_updateBadge() { assertEquals(drawnDrawable.getCreatedFromResId(), darkDrawable.getCreatedFromResId()); assertNotEquals(drawnDrawable.getCreatedFromResId(), lightDrawable.getCreatedFromResId()); - mMenuButton.onTintChanged(mColorStateList, BrandedColorScheme.DARK_BRANDED_THEME); + mMenuButton.onTintChanged(mColorStateList, true); drawnDrawable = shadowOf(mMenuButton.getTabSwitcherAnimationDrawable()); assertEquals(drawnDrawable.getCreatedFromResId(), lightDrawable.getCreatedFromResId()); assertNotEquals(drawnDrawable.getCreatedFromResId(), darkDrawable.getCreatedFromResId()); @@ -116,7 +114,7 @@ public void testDrawTabSwitcherAnimationOverlay_updateBadgeNotAvailable() { @Test public void testDrawTabSwitcherAnimationOverlay_correctBoundsAfterThemeChange() { mMenuButton.removeAppMenuUpdateBadge(false); - mMenuButton.onTintChanged(mColorStateList, BrandedColorScheme.DARK_BRANDED_THEME); + mMenuButton.onTintChanged(mColorStateList, true); // Run a manual layout pass so that mMenuButton's children get assigned sizes. mMenuButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java index 556e4ff669ab5c..000c4d96f49ad5 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java @@ -47,7 +47,7 @@ public void bind(PropertyModel model, MenuButton view, PropertyKey propertyKey) } else if (propertyKey == MenuButtonProperties.THEME) { bind(model, view, MenuButtonProperties.STATE_SUPPLIER); ThemeProperty themeProperty = model.get(MenuButtonProperties.THEME); - view.onTintChanged(themeProperty.mColorStateList, themeProperty.mBrandedColorScheme); + view.onTintChanged(themeProperty.mColorStateList, themeProperty.mUseLightColors); } else if (propertyKey == MenuButtonProperties.TRANSLATION_X) { view.setTranslationX(model.get(MenuButtonProperties.TRANSLATION_X)); } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index f62e56704b6a94..be5de17a932f1a 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java @@ -55,7 +55,6 @@ import org.chromium.chrome.browser.toolbar.top.ToolbarTablet.OfflineDownloader; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.UiUtils; import org.chromium.ui.base.ViewUtils; @@ -207,8 +206,15 @@ protected ColorStateList getTint() { return mThemeColorProvider == null ? mDefaultTint : mThemeColorProvider.getTint(); } + /** + * @return Whether to use light assets. + */ + protected boolean useLight() { + return mThemeColorProvider != null && mThemeColorProvider.useLight(); + } + @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) {} + public void onTintChanged(ColorStateList tint, boolean useLight) {} @Override public void onThemeColorChanged(int color, boolean shouldAnimate) {} diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 1e47554a0a067b..ef28d03fa628b8 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java @@ -66,7 +66,6 @@ import org.chromium.chrome.browser.toolbar.TabSwitcherDrawable; import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonCoordinator; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener; import org.chromium.components.browser_ui.widget.animation.Interpolators; @@ -148,7 +147,7 @@ public class ToolbarPhone extends ToolbarLayout implements OnClickListener, TabC @ViewDebug.ExportedProperty(category = "chrome") protected boolean mTextureCaptureMode; private boolean mForceTextureCapture; - private int mTintUsedForLastTextureCapture; + private boolean mLightDrawablesUsedForLastTextureCapture; private int mTabCountForLastTextureCapture; @ViewDebug.ExportedProperty(category = "chrome") @@ -1327,7 +1326,7 @@ void drawTabSwitcherAnimationOverlay(Canvas canvas, float animationProgress) { mToolbarButtonsContainer, canvas, rgbAlpha); } - mTintUsedForLastTextureCapture = getTint().getDefaultColor(); + mLightDrawablesUsedForLastTextureCapture = useLight(); if (mTabSwitcherAnimationTabStackDrawable != null && mToggleTabStackButton != null) { mTabCountForLastTextureCapture = mTabSwitcherAnimationTabStackDrawable.getTabCount(); @@ -1558,7 +1557,7 @@ public boolean setForceTextureCapture(boolean forceTextureCapture) { if (forceTextureCapture) { // Only force a texture capture if the tint for the toolbar drawables is changing or // if the tab count has changed since the last texture capture. - mForceTextureCapture = mTintUsedForLastTextureCapture != getTint().getDefaultColor(); + mForceTextureCapture = mLightDrawablesUsedForLastTextureCapture != useLight(); if (mTabSwitcherAnimationTabStackDrawable != null && mToggleTabStackButton != null) { mForceTextureCapture = mForceTextureCapture @@ -1636,21 +1635,16 @@ public void updateButtonVisibility() { } @Override - public void onThemeColorChanged(int color, boolean shouldAnimate) { - if (mToggleTabStackButton != null) { - final boolean useLight = ColorUtils.shouldUseLightForegroundOnBackground(color); - mToggleTabStackButton.setUseLightDrawables(useLight); - } - } - - @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { if (mHomeButton != null) { ApiCompatibilityUtils.setImageTintList(mHomeButton, tint); } - if (mToggleTabStackButton != null && mTabSwitcherAnimationTabStackDrawable != null) { - mTabSwitcherAnimationTabStackDrawable.setTint(tint); + if (mToggleTabStackButton != null) { + mToggleTabStackButton.setUseLightDrawables(useLight); + if (mTabSwitcherAnimationTabStackDrawable != null) { + mTabSwitcherAnimationTabStackDrawable.setTint(tint); + } } if (mOptionalButton != null && mOptionalButtonUsesTint) { diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index 15395d2a028555..c8024bbb1a3c90 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java @@ -48,12 +48,10 @@ import org.chromium.chrome.browser.toolbar.ToolbarTabController; import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonCoordinator; import org.chromium.chrome.browser.toolbar.top.NavigationPopup.HistoryDelegate; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.ui.UiUtils; import org.chromium.ui.base.DeviceFormFactor; -import org.chromium.ui.util.ColorUtils; import org.chromium.ui.widget.Toast; import java.util.ArrayList; @@ -380,12 +378,13 @@ void onTabOrModelChanged() { } @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { ApiCompatibilityUtils.setImageTintList(mHomeButton, tint); ApiCompatibilityUtils.setImageTintList(mBackButton, tint); ApiCompatibilityUtils.setImageTintList(mForwardButton, tint); ApiCompatibilityUtils.setImageTintList(mSaveOfflineButton, tint); ApiCompatibilityUtils.setImageTintList(mReloadButton, tint); + mAccessibilitySwitcherButton.setUseLightDrawables(useLight); if (mOptionalButton != null && mOptionalButtonUsesTint) { ApiCompatibilityUtils.setImageTintList(mOptionalButton, tint); @@ -400,8 +399,6 @@ public void onThemeColorChanged(int color, boolean shouldAnimate) { mLocationBar.getTabletCoordinator().getBackground().setTint(textBoxColor); mLocationBar.updateVisualsForState(); setToolbarHairlineColor(color); - final boolean useLight = ColorUtils.shouldUseLightForegroundOnBackground(color); - mAccessibilitySwitcherButton.setUseLightDrawables(useLight); } /** diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager.cc b/chrome/browser/ui/ash/projector/pending_screencast_manager.cc index 10c1b28e61efbf..0369404a50c93a 100644 --- a/chrome/browser/ui/ash/projector/pending_screencast_manager.cc +++ b/chrome/browser/ui/ash/projector/pending_screencast_manager.cc @@ -4,9 +4,11 @@ #include "chrome/browser/ui/ash/projector/pending_screencast_manager.h" +#include +#include + #include "ash/components/drivefs/mojom/drivefs.mojom.h" #include "ash/public/cpp/projector/projector_controller.h" -#include "ash/webui/projector_app/projector_app_client.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -23,6 +25,10 @@ namespace { +// Returned by GetScreencastContainerSize(const base::FilePath& relative_path) +// when the given `relative_path` is an invalid screencast container. +constexpr int64_t kScreencastSizeUnavailable = -1; + constexpr base::FilePath::CharType kMediaExtension[] = FILE_PATH_LITERAL(".webm"); @@ -45,53 +51,61 @@ drivefs::DriveFsHost* GetDriveFsHostForActiveProfile() { return drivefs_integration ? drivefs_integration->GetDriveFsHost() : nullptr; } -// Verifies whether `relative_path` is a valid screencast container. A valid +// Return the size in bytes of screencast if `absolute_path` is a valid +// screencast container, otherwise return kScreencastSizeUnavailable. A valid // screencast should have at least 1 media file and 1 metadata file. The -// 'relative_path' looks like -// "/{drivefs mounted point}/root/{folder path in drive}" -bool IsScreencastContainer(const base::FilePath& relative_path) { +// 'absolute_path' looks like +// "/{drivefs mounted point}/root/{folder path in drive}". +int64_t GetScreencastContainerSize(const base::FilePath& absolute_path) { DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - if (!base::PathExists(relative_path)) - return false; + if (!base::PathExists(absolute_path)) + return kScreencastSizeUnavailable; - int number_of_metadata_files = 0; - int number_of_media_files = 0; - base::FileEnumerator files(relative_path, /* recursive */ false, + int size_of_metadata_files = 0; + int size_of_media_files = 0; + base::FileEnumerator files(absolute_path, /*recursive=*/false, base::FileEnumerator::FILES); const std::string metadata_extension = GetMetadataFileExtension(); for (base::FilePath path = files.Next(); !path.empty(); path = files.Next()) { - if (path.MatchesExtension(metadata_extension)) - number_of_metadata_files++; - - if (path.MatchesExtension(kMediaExtension)) - number_of_media_files++; - - if (number_of_media_files > 0 && number_of_metadata_files > 0) - return true; + if (path.MatchesExtension(GetMetadataFileExtension())) + size_of_metadata_files += files.GetInfo().GetSize(); + else if (path.MatchesExtension(kMediaExtension)) + size_of_media_files += files.GetInfo().GetSize(); } - return number_of_media_files > 0 && number_of_metadata_files > 0; + return size_of_media_files > 0 && size_of_metadata_files > 0 + ? size_of_media_files + size_of_metadata_files + : kScreencastSizeUnavailable; } -// The `pending_webm_or_projector_files` are new pending ".webm" or ".projector" -// files. Checks whether these files are valid screencast files and returns -// valid pending screencasts. -std::set ProcessAndGenerateNewScreencasts( - const std::vector& pending_webm_or_projector_files, - const base::FilePath drivefs_mounted_point) { +// The `pending_webm_or_projector_events` are new pending ".webm" or +// ".projector" files' events. Checks whether these files are valid screencast +// files, calculate the upload progress, and returns valid pending screencasts. +ash::PendingScreencastSet ProcessAndGenerateNewScreencasts( + const std::vector& + pending_webm_or_projector_events, + drive::DriveIntegrationService* drivefs_integration) { DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - + const base::FilePath drivefs_mounted_point = + drivefs_integration->GetMountPointPath(); // The valid screencasts set. - std::set screencasts; - if (!base::PathExists(drivefs_mounted_point)) + ash::PendingScreencastSet screencasts; + if (!drivefs_integration->IsMounted() || + !base::PathExists(drivefs_mounted_point)) { return screencasts; + } - // `pending_file` is a relative path to DriveFs mounted folder. It looks like + // A map of container directory path to pending screencast. Each screencast + // has a unique container directory path in DriveFS. + std::map container_to_screencasts; + + // The `pending_event.path` is the file path in drive. It looks like // "/root/{folder path in drive}/{file name}". - for (const auto& pending_file : pending_webm_or_projector_files) { - // `container_dir` is the parent folder of `pending_file` in drive. It looks - // like "/root/{folder path in drive}". - const base::FilePath container_dir = pending_file.DirName(); + for (const auto& pending_event : pending_webm_or_projector_events) { + // `container_dir` is the parent folder of `pending_event.path` in drive. It + // looks like "/root/{folder path in drive}". + const base::FilePath container_dir = + base::FilePath(pending_event.path).DirName(); ash::PendingScreencast screencast; screencast.container_dir = container_dir; // The display name of the a pending screencast is the name of the container @@ -99,17 +113,37 @@ std::set ProcessAndGenerateNewScreencasts( screencast.name = container_dir.BaseName().value(); // During this loop, items of multiple events might be under the same - // folder. Skips folders that have been validated before. - if (screencasts.find(screencast) != screencasts.end()) + // folder. + auto iter = container_to_screencasts.find(container_dir); + if (iter != container_to_screencasts.end()) { + // Calculates remaining untranferred bytes of a screencast by adding up + // its transferred bytes of its files. `pending_event.bytes_to_transfer` + // is the total bytes of current file. + // TODO(b/209854146) Not all files appear in + // `pending_webm_or_projector_events.bytes_transferred`. The missing files + // might be uploaded or not uploaded. To get an accurate + // `bytes_transferred`, use DriveIntegrationService::GetMetadata(). + iter->second.bytes_transferred += pending_event.bytes_transferred; + + // Skips getting the size of a folder if it has been validated before. continue; + } base::FilePath root("/"); base::FilePath container_absolute_dir(drivefs_mounted_point); root.AppendRelativePath(container_dir, &container_absolute_dir); - if (IsScreencastContainer(container_absolute_dir)) - screencasts.emplace(screencast); + const int64_t total_size_in_bytes = + GetScreencastContainerSize(container_absolute_dir); + if (total_size_in_bytes != -1) { + screencast.total_size_in_bytes = total_size_in_bytes; + screencast.bytes_transferred = pending_event.bytes_transferred; + container_to_screencasts[container_dir] = screencast; + } } + for (const auto& pair : container_to_screencasts) + screencasts.insert(pair.second); + return screencasts; } @@ -151,7 +185,7 @@ void PendingSreencastManager::OnUnmounted() { // download event. Find a way to filter out the upload event. void PendingSreencastManager::OnSyncingStatusUpdate( const drivefs::mojom::SyncingStatus& status) { - std::vector pending_webm_or_projector_files; + std::vector pending_webm_or_projector_events; for (const auto& event : status.item_events) { base::FilePath pending_file = base::FilePath(event->path); @@ -159,21 +193,20 @@ void PendingSreencastManager::OnSyncingStatusUpdate( event->state == drivefs::mojom::ItemEvent::State::kQueued || event->state == drivefs::mojom::ItemEvent::State::kInProgress; // Filters pending ".webm" or ".projector". - if (!pending || !IsWebmOrProjectorFile(pending_file)) { + if (!pending || !IsWebmOrProjectorFile(pending_file)) continue; - } - pending_webm_or_projector_files.push_back(pending_file); + pending_webm_or_projector_events.push_back( + drivefs::mojom::ItemEvent(*event.get())); } // The `task` is a blocking I/O operation while `reply` runs on current // thread. blocking_task_runner_->PostTaskAndReplyWithResult( FROM_HERE, - base::BindOnce( - ProcessAndGenerateNewScreencasts, - std::move(pending_webm_or_projector_files), - GetDriveIntegrationServiceForActiveProfile()->GetMountPointPath()), + base::BindOnce(ProcessAndGenerateNewScreencasts, + std::move(pending_webm_or_projector_events), + GetDriveIntegrationServiceForActiveProfile()), base::BindOnce( &PendingSreencastManager::OnProcessAndGenerateNewScreencastsFinished, weak_ptr_factory_.GetWeakPtr())); @@ -190,13 +223,13 @@ void PendingSreencastManager::OnUserSessionStarted(bool is_primary_user) { GetDriveFsHostForActiveProfile()->AddObserver(this); } -const std::set& +const ash::PendingScreencastSet& PendingSreencastManager::GetPendingScreencasts() const { return pending_screencast_cache_; } void PendingSreencastManager::OnProcessAndGenerateNewScreencastsFinished( - const std::set& screencasts) { + const ash::PendingScreencastSet& screencasts) { // Return if pending screencasts didn't change. if (screencasts == pending_screencast_cache_) return; diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager.h b/chrome/browser/ui/ash/projector/pending_screencast_manager.h index b1a47fbd286efa..514aaf923a41b0 100644 --- a/chrome/browser/ui/ash/projector/pending_screencast_manager.h +++ b/chrome/browser/ui/ash/projector/pending_screencast_manager.h @@ -5,10 +5,9 @@ #ifndef CHROME_BROWSER_UI_ASH_PROJECTOR_PENDING_SCREENCAST_MANAGER_H_ #define CHROME_BROWSER_UI_ASH_PROJECTOR_PENDING_SCREENCAST_MANAGER_H_ -#include - #include "ash/components/drivefs/drivefs_host.h" #include "ash/components/drivefs/drivefs_host_observer.h" +#include "ash/webui/projector_app/projector_app_client.h" #include "base/callback.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" @@ -23,15 +22,11 @@ class DriveError; } // namespace mojom } // namespace drivefs -namespace ash { -struct PendingScreencast; -} - // A callback to notify the change of pending screencasts to // ProjectorAppClient::Observer. The argument is the set of pending screencasts // owned by PendingSreencastManager. using PendingScreencastChangeCallback = - base::RepeatingCallback&)>; + base::RepeatingCallback; // A class that handles pending screencast events. class PendingSreencastManager : public session_manager::SessionManagerObserver, @@ -53,15 +48,15 @@ class PendingSreencastManager : public session_manager::SessionManagerObserver, void OnUserSessionStarted(bool is_primary_user) override; // Returns a list of pending screencast from `pending_screencast_cache_`. - const std::set& GetPendingScreencasts() const; + const ash::PendingScreencastSet& GetPendingScreencasts() const; private: // Updates `pending_screencast_cache_` and notifies pending screencast change. void OnProcessAndGenerateNewScreencastsFinished( - const std::set& screencasts); + const ash::PendingScreencastSet& screencasts); // A set that caches current pending screencast. - std::set pending_screencast_cache_; + ash::PendingScreencastSet pending_screencast_cache_; // A callback to notify pending screencast status change. PendingScreencastChangeCallback pending_screencast_change_callback_; diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc b/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc index 76a1b35d863d20..27e9563a7e3094 100644 --- a/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc +++ b/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc @@ -34,9 +34,15 @@ constexpr char kTestScreencastPath[] = "/root/test_screencast"; constexpr char kTestScreencastName[] = "test_screencast"; constexpr char kTestMediaFile[] = "test_screencast.webm"; constexpr char kTestMetadataFile[] = "test_screencast.projector"; +// constexpr char kTestDataToWrite[] = "Data size of 16."; +// The test media file is 0.7 mb. +constexpr int64_t kTestMediaFileBytes = 700 * 1024; +// The test metadata file is 0.1 mb. +constexpr int64_t kTestMetadataFileBytes = 100 * 1024; } // namespace +// TODO(b/211000693) Replace all RunAllTasksUntilIdle with a waiting condition. class PendingScreencastMangerBrowserTest : public InProcessBrowserTest { public: bool SetUpUserDataDirectory() override { @@ -78,7 +84,15 @@ class PendingScreencastMangerBrowserTest : public InProcessBrowserTest { return integration_service; } - void CreateFile(const std::string& file_path) { + // Create a file for given `file_path`, which is a relative file path of + // drivefs. Write `total_bytes` to this file. Create a drivefs syncing event + // for this file with `transferred_bytes` transferred and add this event to + // `syncing_status`. + void CreateFileAndTransferItemEvent( + const std::string& file_path, + int64_t total_bytes, + int64_t transferred_bytes, + drivefs::mojom::SyncingStatus& syncing_status) { base::ScopedAllowBlockingForTesting allow_blocking; drive::DriveIntegrationService* service = @@ -97,25 +111,34 @@ class PendingScreencastMangerBrowserTest : public InProcessBrowserTest { EXPECT_TRUE(base::CreateDirectory(folder_path)); base::File file(folder_path.Append(path.BaseName()), - base::File::FLAG_CREATE | base::File::FLAG_READ); - + base::File::FLAG_CREATE | base::File::FLAG_WRITE); + // Create a buffer whose size is `total_bytes`. + std::string buffer(total_bytes, 'a'); + EXPECT_EQ(total_bytes, + file.Write(/*offset=*/0, buffer.data(), /*size=*/total_bytes)); EXPECT_TRUE(file.IsValid()); file.Close(); + + AddTransferItemEvent(syncing_status, file_path, total_bytes, + transferred_bytes); } void AddTransferItemEvent(drivefs::mojom::SyncingStatus& syncing_status, - bool completed, - const std::string& path) { + const std::string& path, + int64_t total_bytes, + int64_t transferred_bytes) { syncing_status.item_events.emplace_back( - base::in_place, /*stable_id*/ 1, /*group_id*/ 1, path, - completed ? drivefs::mojom::ItemEvent::State::kCompleted - : drivefs::mojom::ItemEvent::State::kInProgress, - /*bytes_transferred*/ completed ? 100 : 50, /*bytes_to_transfer*/ 100, + base::in_place, /*stable_id=*/1, /*group_id=*/1, path, + total_bytes == transferred_bytes + ? drivefs::mojom::ItemEvent::State::kCompleted + : drivefs::mojom::ItemEvent::State::kInProgress, + /*bytes_transferred=*/transferred_bytes, + /*bytes_to_transfer=*/total_bytes, drivefs::mojom::ItemEventReason::kTransfer); } MOCK_METHOD1(PendingScreencastChangeCallback, - void(const std::set&)); + void(const PendingScreencastSet&)); PendingSreencastManager* pending_screencast_manager() { return pending_screencast_manager_.get(); @@ -136,20 +159,22 @@ IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, ValidScreencast) { base::StrCat({kTestScreencastPath, "/", kTestMediaFile}); const std::string metadata_file = base::StrCat({kTestScreencastPath, "/", kTestMetadataFile}); + drivefs::mojom::SyncingStatus syncing_status; { // Create a valid pending screencast. - CreateFile(media_file); - CreateFile(metadata_file); + CreateFileAndTransferItemEvent(media_file, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); + CreateFileAndTransferItemEvent(metadata_file, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/0, syncing_status); } - drivefs::mojom::SyncingStatus syncing_status; - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ media_file); EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(1); pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); content::RunAllTasksUntilIdle(); - const std::set pending_screencasts = + const PendingScreencastSet pending_screencasts = pending_screencast_manager()->GetPendingScreencasts(); EXPECT_EQ(pending_screencasts.size(), 1); ash::PendingScreencast ps = *(pending_screencasts.begin()); @@ -176,30 +201,28 @@ IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, InvalidScreencasts) { const std::string avi = "/root/non_screencast_files/example.avi"; const std::string mov = "/root/non_screencast_files/example.mov"; const std::string mp4 = "/root/non_screencast_files/example.mp4"; - + drivefs::mojom::SyncingStatus syncing_status; { // Create an invalid screencast that only has webm medida file. - CreateFile(media_only_path); + CreateFileAndTransferItemEvent(media_only_path, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); // Create an invalid screencast that only has metadata file. - CreateFile(metadata_only_path); + CreateFileAndTransferItemEvent(metadata_only_path, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/0, syncing_status); // Create an invalid screencast that does not have webm media and metadata // files but have other media files. - CreateFile(avi); - CreateFile(mov); - CreateFile(mp4); + CreateFileAndTransferItemEvent(avi, /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); + CreateFileAndTransferItemEvent(mov, /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); + CreateFileAndTransferItemEvent(mp4, /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); } - drivefs::mojom::SyncingStatus syncing_status; - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ media_only_path); - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ metadata_only_path); - AddTransferItemEvent(syncing_status, /*completed*/ false, /*path*/ avi); - AddTransferItemEvent(syncing_status, /*completed*/ false, /*path*/ mov); - AddTransferItemEvent(syncing_status, /*completed*/ false, /*path*/ mp4); - EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(0); pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); @@ -214,15 +237,17 @@ IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, base::StrCat({kTestScreencastPath, "/", kTestMediaFile}); const std::string metadata_file = base::StrCat({kTestScreencastPath, "/", kTestMetadataFile}); + drivefs::mojom::SyncingStatus syncing_status; { // Create a valid uploaded screencast. - CreateFile(media_file); - CreateFile(metadata_file); + CreateFileAndTransferItemEvent(media_file, + /*total_bytes=*/kTestMediaFileBytes, + kTestMediaFileBytes, syncing_status); + CreateFileAndTransferItemEvent(metadata_file, + /*total_bytes=*/kTestMetadataFileBytes, + kTestMetadataFileBytes, syncing_status); } - drivefs::mojom::SyncingStatus syncing_status; - AddTransferItemEvent(syncing_status, /*completed*/ true, /*path*/ media_file); - EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(0); pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); @@ -244,39 +269,37 @@ IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, base::StrCat({test_screencast_path, "/", kTestMediaFile}); const std::string metadata = base::StrCat({test_screencast_path, "/", kTestMetadataFile}); - CreateFile(media); - CreateFile(metadata); - - AddTransferItemEvent(syncing_status, /*completed*/ false, /*path*/ media); - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ metadata); + CreateFileAndTransferItemEvent(media, /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); + CreateFileAndTransferItemEvent(metadata, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/0, syncing_status); } // Tests with a invalid screencast does not have metadata file. const std::string no_metadata_screencast = "/root/no_metadata/example.webm"; - CreateFile(no_metadata_screencast); - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ no_metadata_screencast); - + CreateFileAndTransferItemEvent(no_metadata_screencast, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); // Tests with a invalid screencast does not have media file. const std::string no_media_screencast = "/root/no_media/example.projector"; - CreateFile(no_media_screencast); - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ no_media_screencast); + CreateFileAndTransferItemEvent(no_media_screencast, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); // Tests with a non-screencast file. const std::string non_screencast = "/root/non_screencast/example.txt"; - CreateFile(non_screencast); - AddTransferItemEvent(syncing_status, /*completed*/ false, - /*path*/ non_screencast); + CreateFileAndTransferItemEvent(non_screencast, /*total_bytes=*/100, + /*transferred_bytes=*/0, syncing_status); } EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(1); pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); content::RunAllTasksUntilIdle(); - const std::set pending_screencasts = + const PendingScreencastSet pending_screencasts = pending_screencast_manager()->GetPendingScreencasts(); + int64_t total_size = kTestMediaFileBytes + kTestMetadataFileBytes; // Only valid screencasts could be processed. EXPECT_EQ(pending_screencasts.size(), num_of_screencasts); @@ -285,9 +308,156 @@ IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, base::StrCat({kTestScreencastPath, base::NumberToString(i)}); const std::string name = base::StrCat({kTestScreencastName, base::NumberToString(i)}); - ash::PendingScreencast ps{base::FilePath(container_dir), name}; + ash::PendingScreencast ps{base::FilePath(container_dir), name, total_size, + 0}; EXPECT_TRUE(pending_screencasts.find(ps) != pending_screencasts.end()); } } +IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, UploadProgress) { + const std::string media_file_path = + base::StrCat({kTestScreencastPath, "/", kTestMediaFile}); + const std::string metadata_file_path = + base::StrCat({kTestScreencastPath, "/", kTestMetadataFile}); + drivefs::mojom::SyncingStatus syncing_status; + { + // Create a valid pending screencast. + CreateFileAndTransferItemEvent(media_file_path, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/0, syncing_status); + CreateFileAndTransferItemEvent(metadata_file_path, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/0, syncing_status); + } + + EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(1); + pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); + + content::RunAllTasksUntilIdle(); + + const PendingScreencastSet pending_screencasts_1 = + pending_screencast_manager()->GetPendingScreencasts(); + EXPECT_EQ(pending_screencasts_1.size(), 1); + ash::PendingScreencast ps = *(pending_screencasts_1.begin()); + const int total_size = kTestMediaFileBytes + kTestMetadataFileBytes; + EXPECT_EQ(total_size, ps.total_size_in_bytes); + EXPECT_EQ(0, ps.bytes_transferred); + + // Tests the metadata file finished transferred. + // PendingScreencastChangeCallback won't be invoked if the difference is less + // than kPendingScreencastDiffThresholdInBytes. + EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(0); + syncing_status.item_events.clear(); + int64_t media_transferred_1_bytes = 1; + int64_t metadata_transferred_bytes = kTestMetadataFileBytes; + AddTransferItemEvent(syncing_status, media_file_path, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/media_transferred_1_bytes); + // Create a completed transferred event for metadata. + AddTransferItemEvent(syncing_status, metadata_file_path, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/metadata_transferred_bytes); + pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); + content::RunAllTasksUntilIdle(); + const PendingScreencastSet pending_screencasts_2 = + pending_screencast_manager()->GetPendingScreencasts(); + ps = *(pending_screencasts_2.begin()); + // The screencast status unchanged. + EXPECT_EQ(total_size, ps.total_size_in_bytes); + EXPECT_EQ(0, ps.bytes_transferred); + + // Tests PendingScreencastChangeCallback will be invoked if the difference of + // transferred bytes is greater than kPendingScreencastDiffThresholdInBytes. + EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(1); + syncing_status.item_events.clear(); + AddTransferItemEvent(syncing_status, media_file_path, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/kTestMediaFileBytes - 1); + // Create a completed transferred event for metadata. + AddTransferItemEvent(syncing_status, metadata_file_path, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/metadata_transferred_bytes); + pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); + content::RunAllTasksUntilIdle(); + const PendingScreencastSet pending_screencasts_3 = + pending_screencast_manager()->GetPendingScreencasts(); + ps = *(pending_screencasts_3.begin()); + // The screencast status changed. + EXPECT_EQ(total_size, ps.total_size_in_bytes); + + // TODO(b/209854146) After fix b/209854146, the `ps.bytes_transferred` is + // `total_size -1`. + EXPECT_EQ(kTestMediaFileBytes - 1, ps.bytes_transferred); + + // Tests PendingScreencastChangeCallback will be invoked when all files + // finished transferred. + EXPECT_CALL(*this, PendingScreencastChangeCallback(testing::_)).Times(1); + syncing_status.item_events.clear(); + // Create completed transferred events for both files. + AddTransferItemEvent(syncing_status, media_file_path, + /*total_bytes=*/kTestMediaFileBytes, + /*transferred_bytes=*/kTestMediaFileBytes); + AddTransferItemEvent(syncing_status, metadata_file_path, + /*total_bytes=*/kTestMetadataFileBytes, + /*transferred_bytes=*/kTestMetadataFileBytes); + pending_screencast_manager()->OnSyncingStatusUpdate(syncing_status); + content::RunAllTasksUntilIdle(); + EXPECT_TRUE(pending_screencast_manager()->GetPendingScreencasts().empty()); +} + +// Test the comparison of pending screencast in a std::set. +IN_PROC_BROWSER_TEST_F(PendingScreencastMangerBrowserTest, + PendingScreencastSet) { + // The `name` and `total_size_in_bytes` of screencast will not be compare in a + // set. + const base::FilePath container_dir_a = base::FilePath("/root/a"); + const std::string screencast_a_name = "a"; + const int64_t screencast_a_total_bytes = 2 * 1024 * 1024; + ash::PendingScreencast screencast_a_1_byte_transferred{ + container_dir_a, screencast_a_name, screencast_a_total_bytes, + /*bytes_transferred=*/1}; + ash::PendingScreencast screencast_a_1kb_transferred{ + container_dir_a, screencast_a_name, screencast_a_total_bytes, + /*bytes_transferred=*/1024}; + ash::PendingScreencast screencast_a_700kb_transferred{ + container_dir_a, screencast_a_name, screencast_a_total_bytes, + /*bytes_transferred=*/700 * 1024}; + + const base::FilePath container_dir_b = base::FilePath("/root/b"); + const std::string screencast_b_name = "b"; + const int64_t screencast_b_total_bytes = 2 * 1024 * 1024; + ash::PendingScreencast screencast_b_1_byte_transferred{ + container_dir_b, screencast_b_name, screencast_b_total_bytes, + /*bytes_transferred=*/1}; + ash::PendingScreencast screencast_b_1kb_transferred{ + container_dir_b, screencast_b_name, screencast_b_total_bytes, + /*bytes_transferred=*/1024}; + ash::PendingScreencast screencast_b_700kb_transferred{ + container_dir_b, screencast_b_name, screencast_b_total_bytes, + /*bytes_transferred=*/700 * 1024}; + + PendingScreencastSet set1{screencast_a_1_byte_transferred, + screencast_b_1_byte_transferred}; + PendingScreencastSet set2{screencast_a_1_byte_transferred, + screencast_b_1_byte_transferred}; + PendingScreencastSet set3{screencast_a_1kb_transferred, + screencast_b_1_byte_transferred}; + PendingScreencastSet set4{screencast_a_700kb_transferred, + screencast_b_1_byte_transferred}; + PendingScreencastSet set5{screencast_a_1_byte_transferred, + screencast_a_700kb_transferred}; + PendingScreencastSet set6{screencast_a_700kb_transferred, + screencast_a_1_byte_transferred}; + PendingScreencastSet set7{screencast_a_1_byte_transferred, + screencast_a_1kb_transferred}; + + EXPECT_EQ(set1, set2); + EXPECT_EQ(set1, set3); + EXPECT_NE(set1, set4); + EXPECT_NE(set1, set5); + EXPECT_EQ(set5, set6); + EXPECT_EQ(2, set5.size()); + EXPECT_EQ(2, set7.size()); +} + } // namespace ash diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc index 31bf81bccfb0a3..ad69c444393a0a 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc @@ -9,12 +9,14 @@ #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/projector/projector_controller.h" +#include "ash/webui/projector_app/public/cpp/projector_app_constants.h" #include "base/bind.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/chrome_pages.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/soda/constants.h" @@ -101,13 +103,13 @@ void ProjectorAppClientImpl::OnNewScreencastPreconditionChanged( observer.OnNewScreencastPreconditionChanged(precondition); } -const std::set& -ProjectorAppClientImpl::GetPendingScreencasts() const { +const ash::PendingScreencastSet& ProjectorAppClientImpl::GetPendingScreencasts() + const { return pending_screencast_manager_.GetPendingScreencasts(); } void ProjectorAppClientImpl::NotifyScreencastsPendingStatusChanged( - const std::set& pending_screencast) { + const ash::PendingScreencastSet& pending_screencast) { for (auto& observer : observers_) observer.OnScreencastsPendingStatusChanged(pending_screencast); } @@ -144,3 +146,16 @@ bool ProjectorAppClientImpl::IsSpeechRecognitionAvailable() { soda_installation_controller_->IsSodaAvailable( GetLocaleLanguageCode()); } + +void ProjectorAppClientImpl::OpenFeedbackDialog() { + Profile* profile = ProfileManager::GetActiveUserProfile(); + constexpr char kProjectorAppFeedbackCategoryTag[] = "FromProjectorApp"; + chrome::ShowFeedbackPage(GURL(ash::kChromeUITrustedProjectorUrl), profile, + chrome::kFeedbackSourceProjectorApp, + /*description_template=*/std::string(), + /*description_placeholder_text=*/std::string(), + kProjectorAppFeedbackCategoryTag, + /*extra_diagnostics=*/std::string()); + // TODO(crbug/1048368): Communicate the dialog failing to open by returning an + // error string. For now, assume that the dialog has opened successfully. +} diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.h b/chrome/browser/ui/ash/projector/projector_app_client_impl.h index a5930c7a282cc3..827341f7600a11 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.h +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.h @@ -6,7 +6,6 @@ #define CHROME_BROWSER_UI_ASH_PROJECTOR_PROJECTOR_APP_CLIENT_IMPL_H_ #include -#include #include "ash/webui/projector_app/projector_app_client.h" #include "base/memory/weak_ptr.h" @@ -41,18 +40,18 @@ class ProjectorAppClientImpl : public ash::ProjectorAppClient { network::mojom::URLLoaderFactory* GetUrlLoaderFactory() override; void OnNewScreencastPreconditionChanged( const ash::NewScreencastPrecondition& precondition) override; - const std::set& GetPendingScreencasts() - const override; + const ash::PendingScreencastSet& GetPendingScreencasts() const override; bool ShouldDownloadSoda() override; bool IsSpeechRecognitionAvailable() override; void InstallSoda() override; void OnSodaInstallProgress(int combined_progress) override; void OnSodaInstallError() override; void OnSodaInstalled() override; + void OpenFeedbackDialog() override; private: void NotifyScreencastsPendingStatusChanged( - const std::set& pending_screencast); + const ash::PendingScreencastSet& pending_screencast); base::ObserverList observers_; diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h index e0c47e56d6c62f..01a660e0c244b9 100644 --- a/chrome/browser/ui/chrome_pages.h +++ b/chrome/browser/ui/chrome_pages.h @@ -79,6 +79,7 @@ enum FeedbackSource { kFeedbackSourceQuickAnswers, kFeedbackSourceWhatsNew, kFeedbackSourceConnectivityDiagnostics, + kFeedbackSourceProjectorApp, // Must be last. kFeedbackSourceCount, diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index 7b3d912fa3d7e3..95e57e62197b67 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc @@ -129,6 +129,10 @@ #include "chrome/browser/ui/startup/web_app_url_handling_startup_utils.h" #endif +#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) +#include "chrome/browser/ui/startup/web_app_info_recorder_utils.h" +#endif + using content::BrowserThread; using content::ChildProcessSecurityPolicy; @@ -901,6 +905,21 @@ bool StartupBrowserCreator::ProcessCmdLineImpl( silent_launch = true; } +#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) + // Writes open and installed web apps to the specified file without + // launching a new browser window or tab. + if (command_line.HasSwitch(switches::kListApps)) { + base::FilePath output_file( + command_line.GetSwitchValuePath(switches::kListApps)); + if (!output_file.empty() && output_file.IsAbsolute()) { + base::FilePath profile_base_name( + command_line.GetSwitchValuePath(switches::kProfileBaseName)); + chrome::startup::WriteWebAppsToFile(output_file, profile_base_name); + } + return true; + } +#endif // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) + #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS) if (base::FeatureList::IsEnabled(features::kOnConnectNative) && command_line.HasSwitch(switches::kNativeMessagingConnectHost) && diff --git a/chrome/browser/ui/startup/startup_browser_creator.h b/chrome/browser/ui/startup/startup_browser_creator.h index 813490db0e5dff..3f793b15033b72 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.h +++ b/chrome/browser/ui/startup/startup_browser_creator.h @@ -196,6 +196,8 @@ class StartupBrowserCreator { ValidNotificationLaunchId); FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, InvalidNotificationLaunchId); + FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, ListAppsForAllProfiles); + FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, ListAppsForGivenProfile); FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorChromeAppShortcutTest, OpenAppShortcutNoPref); FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorChromeAppShortcutTest, diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index 06bdeae8120801..7a92f1ade18428 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc @@ -128,6 +128,7 @@ #include "components/policy/core/common/policy_types.h" #if defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) +#include "base/json/json_string_value_serializer.h" #include "chrome/browser/ui/views/web_apps/web_app_protocol_handler_intent_picker_dialog_view.h" #include "chrome/browser/web_applications/os_integration_manager.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" @@ -1613,6 +1614,227 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ASSERT_EQ(1u, chrome::GetBrowserCount(profile2)); } +#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) +web_app::AppId InstallPWAWithName(Profile* profile, + const GURL& start_url, + const std::string& app_name) { + auto web_app_info = std::make_unique(); + web_app_info->start_url = start_url; + web_app_info->scope = start_url.GetWithoutFilename(); + web_app_info->user_display_mode = blink::mojom::DisplayMode::kStandalone; + web_app_info->title = base::UTF8ToUTF16(app_name); + return web_app::test::InstallWebApp(profile, std::move(web_app_info)); +} + +IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ListAppsForAllProfiles) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + base::FilePath user_data_dir = profile_manager->user_data_dir(); + Profile* profile1 = browser()->profile(); + + // Create a new profile. + Profile* profile2 = nullptr; + { + base::ScopedAllowBlockingForTesting allow_blocking; + profile2 = profile_manager->GetProfile( + user_data_dir.Append(FILE_PATH_LITERAL("New Profile 1"))); + } + ASSERT_TRUE(profile2); + + // Install web apps for the two profiles. + auto example_url1 = GURL("http://www.example_one.com"); + std::string app_name1 = "A Test Web App1"; + web_app::AppId app_id1 = + InstallPWAWithName(profile1, example_url1, app_name1); + auto example_url2 = GURL("http://www.example_two.com"); + std::string app_name2 = "A Test Web App2"; + web_app::AppId app_id2 = + InstallPWAWithName(profile1, example_url2, app_name2); + auto example_url3 = GURL("http://www.example_three.com"); + std::string app_name3 = "A Test Web App3"; + web_app::AppId app_id3 = + InstallPWAWithName(profile2, example_url3, app_name3); + auto example_url4 = GURL("http://www.example_four.com"); + std::string app_name4 = "A Test Web App4"; + web_app::AppId app_id4 = + InstallPWAWithName(profile2, example_url4, app_name4); + + // Launch web apps for the two profiles. + Browser* app_browser1 = + web_app::LaunchWebAppBrowserAndWait(profile1, app_id1); + Browser* app_browser2 = + web_app::LaunchWebAppBrowserAndWait(profile2, app_id3); + ASSERT_NE(app_browser1, nullptr); + ASSERT_NE(app_browser2, nullptr); + + // List web apps for all profiles. + std::vector expected_profiles = {profile2, profile1}; + std::vector expected_installed_apps_id = { + &app_id4, &app_id3, &app_id2, &app_id1}; + std::vector expected_installed_apps_name = { + &app_name4, &app_name3, &app_name2, &app_name1}; + std::vector expected_open_apps_id = {&app_id1, &app_id3}; + std::vector expected_open_apps_name = {&app_name1, &app_name3}; + base::Value apps_for_all_profiles(base::Value::Type::DICTIONARY); + base::Value& installed_apps_for_all_profile = *apps_for_all_profiles.SetKey( + "installed_web_apps", base::Value(base::Value::Type::LIST)); + base::Value& open_apps_for_all_profile = *apps_for_all_profiles.SetKey( + "open_web_apps", base::Value(base::Value::Type::LIST)); + for (int i = 0; i < 2; i++) { + // Get installed web apps. + base::Value installed_item_info(base::Value::Type::DICTIONARY); + installed_item_info.SetStringKey( + "profile_id", expected_profiles[i]->GetBaseName().AsUTF8Unsafe()); + base::Value& installed_apps_per_profile = *installed_item_info.SetKey( + "web_apps", base::Value(base::Value::Type::LIST)); + for (int j = 0; j < 2; j++) { + base::Value web_app_info(base::Value::Type::DICTIONARY); + web_app_info.SetStringKey("id", *expected_installed_apps_id[i * 2 + j]); + web_app_info.SetStringKey("name", + *expected_installed_apps_name[i * 2 + j]); + installed_apps_per_profile.Append(std::move(web_app_info)); + } + installed_apps_for_all_profile.Append(std::move(installed_item_info)); + // Get open web apps. + base::Value open_item_info(base::Value::Type::DICTIONARY); + open_item_info.SetStringKey( + "profile_id", expected_profiles[1 - i]->GetBaseName().AsUTF8Unsafe()); + base::Value& open_apps_per_profile = *open_item_info.SetKey( + "web_apps", base::Value(base::Value::Type::LIST)); + base::Value web_app_info(base::Value::Type::DICTIONARY); + web_app_info.SetStringKey("id", *expected_open_apps_id[i]); + web_app_info.SetStringKey("name", *expected_open_apps_name[i]); + open_apps_per_profile.Append(std::move(web_app_info)); + open_apps_for_all_profile.Append(std::move(open_item_info)); + } + + std::string expected_info; + JSONStringValueSerializer serializer(&expected_info); + serializer.set_pretty_print(true); + EXPECT_TRUE(serializer.Serialize(apps_for_all_profiles)); + + base::CommandLine command_line(base::CommandLine::NO_PROGRAM); + base::FilePath output_path = + user_data_dir.Append(FILE_PATH_LITERAL("AppsForAllProfiles.json")); + command_line.AppendSwitchPath(switches::kListApps, output_path); + ASSERT_TRUE(StartupBrowserCreator().ProcessCmdLineImpl( + command_line, base::FilePath(), chrome::startup::IsProcessStartup::kNo, + browser()->profile(), {})); + + { + base::ScopedAllowBlockingForTesting allow_blocking; + while (!base::PathExists(output_path)) + base::RunLoop().RunUntilIdle(); + std::string file_contents; + base::ReadFileToString(output_path, &file_contents); + ASSERT_EQ(expected_info, file_contents); + } + + CloseBrowserSynchronously(app_browser1); + CloseBrowserSynchronously(app_browser2); +} + +IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ListAppsForGivenProfile) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + base::FilePath user_data_dir = profile_manager->user_data_dir(); + Profile* profile1 = browser()->profile(); + + // Create a new profile. + Profile* profile2 = nullptr; + { + base::ScopedAllowBlockingForTesting allow_blocking; + profile2 = profile_manager->GetProfile( + user_data_dir.Append(FILE_PATH_LITERAL("New Profile 1"))); + } + ASSERT_TRUE(profile2); + + // Install web apps for the two profiles. + auto example_url1 = GURL("http://www.example_one.com"); + std::string app_name1 = "A Test Web App1"; + web_app::AppId app_id1 = + InstallPWAWithName(profile1, example_url1, app_name1); + auto example_url2 = GURL("http://www.example_two.com"); + std::string app_name2 = "A Test Web App2"; + web_app::AppId app_id2 = + InstallPWAWithName(profile1, example_url2, app_name2); + auto example_url3 = GURL("http://www.example_three.com"); + std::string app_name3 = "A Test Web App3"; + web_app::AppId app_id3 = + InstallPWAWithName(profile2, example_url3, app_name3); + auto example_url4 = GURL("http://www.example_four.com"); + std::string app_name4 = "A Test Web App4"; + web_app::AppId app_id4 = + InstallPWAWithName(profile2, example_url4, app_name4); + + // Launch web apps for the two profiles. + Browser* app_browser1 = + web_app::LaunchWebAppBrowserAndWait(profile1, app_id1); + Browser* app_browser2 = + web_app::LaunchWebAppBrowserAndWait(profile2, app_id3); + ASSERT_NE(app_browser1, nullptr); + ASSERT_NE(app_browser2, nullptr); + + // List web apps for the given profile. + base::Value apps_for_given_profiles(base::Value::Type::DICTIONARY); + base::Value& installed_apps_for_given_profile = + *apps_for_given_profiles.SetKey("installed_web_apps", + base::Value(base::Value::Type::LIST)); + base::Value& open_apps_for_given_profile = *apps_for_given_profiles.SetKey( + "open_web_apps", base::Value(base::Value::Type::LIST)); + // Get installed web apps. + base::Value installed_item_info(base::Value::Type::DICTIONARY); + installed_item_info.SetStringKey("profile_id", + profile2->GetBaseName().AsUTF8Unsafe()); + base::Value& installed_apps_per_profile = *installed_item_info.SetKey( + "web_apps", base::Value(base::Value::Type::LIST)); + base::Value web_app_info1(base::Value::Type::DICTIONARY); + web_app_info1.SetStringKey("name", app_name4); + web_app_info1.SetStringKey("id", app_id4); + installed_apps_per_profile.Append(std::move(web_app_info1)); + base::Value web_app_info2(base::Value::Type::DICTIONARY); + web_app_info2.SetStringKey("name", app_name3); + web_app_info2.SetStringKey("id", app_id3); + installed_apps_per_profile.Append(std::move(web_app_info2)); + installed_apps_for_given_profile.Append(std::move(installed_item_info)); + // Get open web apps. + base::Value open_item_info(base::Value::Type::DICTIONARY); + open_item_info.SetStringKey("profile_id", + profile2->GetBaseName().AsUTF8Unsafe()); + base::Value& open_apps_per_profile = + *open_item_info.SetKey("web_apps", base::Value(base::Value::Type::LIST)); + base::Value web_app_info3(base::Value::Type::DICTIONARY); + web_app_info3.SetStringKey("name", app_name3); + web_app_info3.SetStringKey("id", app_id3); + open_apps_per_profile.Append(std::move(web_app_info3)); + open_apps_for_given_profile.Append(std::move(open_item_info)); + + std::string expected_info; + JSONStringValueSerializer serializer(&expected_info); + serializer.set_pretty_print(true); + EXPECT_TRUE(serializer.Serialize(apps_for_given_profiles)); + + base::CommandLine command_line(base::CommandLine::NO_PROGRAM); + base::FilePath output_path = + user_data_dir.Append(FILE_PATH_LITERAL("AppsForGivenProfile.json")); + command_line.AppendSwitchPath(switches::kListApps, output_path); + command_line.AppendSwitchASCII(switches::kProfileBaseName, "New Profile 1"); + ASSERT_TRUE(StartupBrowserCreator().ProcessCmdLineImpl( + command_line, base::FilePath(), chrome::startup::IsProcessStartup::kNo, + browser()->profile(), {})); + + { + base::ScopedAllowBlockingForTesting allow_blocking; + while (!base::PathExists(output_path)) + base::RunLoop().RunUntilIdle(); + std::string file_contents; + base::ReadFileToString(output_path, &file_contents); + ASSERT_EQ(expected_info, file_contents); + } + + CloseBrowserSynchronously(app_browser1); + CloseBrowserSynchronously(app_browser2); +} +#endif // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) + #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS) web_app::AppId InstallPWA(Profile* profile, const GURL& start_url) { auto web_app_info = std::make_unique(); diff --git a/chrome/browser/ui/startup/web_app_info_recorder_utils.cc b/chrome/browser/ui/startup/web_app_info_recorder_utils.cc new file mode 100644 index 00000000000000..bbe3b8221e6589 --- /dev/null +++ b/chrome/browser/ui/startup/web_app_info_recorder_utils.cc @@ -0,0 +1,217 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/startup/web_app_info_recorder_utils.h" + +#include +#include +#include +#include + +#include "base/barrier_closure.h" +#include "base/bind.h" +#include "base/callback.h" +#include "base/containers/flat_map.h" +#include "base/files/file_path.h" +#include "base/files/important_file_writer.h" +#include "base/json/json_string_value_serializer.h" +#include "base/location.h" +#include "base/strings/string_piece.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "base/values.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" +#include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h" +#include "chrome/browser/profiles/profile_attributes_storage.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/web_applications/app_browser_controller.h" +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "components/keep_alive_registry/keep_alive_types.h" +#include "components/keep_alive_registry/scoped_keep_alive.h" + +namespace chrome { +namespace startup { + +namespace { + +// This class is used to write open and installed web apps to the specified +// file. +class GetWebApps { + public: + GetWebApps(const GetWebApps&) = delete; + GetWebApps& operator=(const GetWebApps&) = delete; + + ~GetWebApps() = default; + + static void Start(const base::FilePath& output_file, + const base::FilePath& profile_base_name); + + private: + GetWebApps(const base::FilePath& output_file, + const base::FilePath& profile_base_name) + : output_file_(output_file), + profile_base_name_(profile_base_name), + keep_alive_(std::make_unique( + KeepAliveOrigin::APP_GET_INFO, + KeepAliveRestartOption::DISABLED)) {} + + // Serializes `output_info` to string and posts a task to the thread pool to + // perform the write. + void SerializeAndScheduleWrite(const base::Value& output_info); + + // Get installed web apps for all profiles if |profile_base_name_| is empty. + // Otherwise, get installed web apps only for the given profile. + base::Value GetInstalledWebApps(); + + // Get open web apps for all profiles if |profile_base_name_| is empty. + // Otherwise, get open web apps only for the given profile. + base::Value GetOpenWebApps(); + + void OnProfileLoaded(base::RepeatingClosure call_back, Profile* profile); + + void FetchWebAppsAndWriteToDisk(); + + const base::FilePath output_file_; + const base::FilePath profile_base_name_; + std::unique_ptr keep_alive_; + std::vector profiles_; + std::vector> profiles_keep_alive_; +}; + +// static +void GetWebApps::Start(const base::FilePath& output_file, + const base::FilePath& profile_base_name) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + std::vector profile_attributes_entry = + profile_manager->GetProfileAttributesStorage().GetAllProfilesAttributes(); + size_t profile_count = + profile_base_name.empty() ? profile_attributes_entry.size() : 1; + // The instance is owned by the callback that invokes + // FetchWebAppsAndWriteToDisk once all profiles have been loaded. + std::unique_ptr get_web_apps( + new GetWebApps(output_file, profile_base_name)); + GetWebApps* get_web_apps_ptr = get_web_apps.get(); + base::RepeatingClosure get_webapps_on_providers_ready = base::BarrierClosure( + profile_count, base::BindOnce(&GetWebApps::FetchWebAppsAndWriteToDisk, + std::move(get_web_apps))); + if (profile_base_name.empty()) { + for (auto* item : profile_attributes_entry) { + profile_manager->LoadProfileByPath( + item->GetPath(), /*incognito=*/false, + base::BindOnce(&GetWebApps::OnProfileLoaded, + base::Unretained(get_web_apps_ptr), + get_webapps_on_providers_ready)); + } + } else { + profile_manager->LoadProfile( + profile_base_name, /*incognito=*/false, + base::BindOnce(&GetWebApps::OnProfileLoaded, + base::Unretained(get_web_apps_ptr), + get_webapps_on_providers_ready)); + } +} + +void GetWebApps::SerializeAndScheduleWrite(const base::Value& output_info) { + std::string output_info_str; + JSONStringValueSerializer serializer(&output_info_str); + serializer.set_pretty_print(true); + if (serializer.Serialize(output_info)) { + base::ThreadPool::PostTask( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::BLOCK_SHUTDOWN}, + base::BindOnce( + base::IgnoreResult(&base::ImportantFileWriter::WriteFileAtomically), + output_file_, std::move(output_info_str), base::StringPiece())); + } +} + +base::Value GetWebApps::GetInstalledWebApps() { + base::Value installed_apps_list(base::Value::Type::LIST); + for (auto* item : profiles_) { + web_app::WebAppProvider* web_app_provider = + web_app::WebAppProvider::GetForWebApps(item); + base::Value item_info(base::Value::Type::DICTIONARY); + item_info.SetStringKey("profile_id", item->GetBaseName().AsUTF8Unsafe()); + base::Value& installed_apps_per_profile = + *item_info.SetKey("web_apps", base::Value(base::Value::Type::LIST)); + for (const web_app::WebApp& web_app : + web_app_provider->registrar().GetApps()) { + base::Value web_app_info(base::Value::Type::DICTIONARY); + web_app_info.SetStringKey("name", web_app.name()); + web_app_info.SetStringKey("id", web_app.app_id()); + installed_apps_per_profile.Append(std::move(web_app_info)); + } + installed_apps_list.Append(std::move(item_info)); + } + return installed_apps_list; +} + +base::Value GetWebApps::GetOpenWebApps() { + base::flat_map open_apps; + for (Browser* browser : *BrowserList::GetInstance()) { + if (browser->type() != Browser::Type::TYPE_APP) + continue; + std::string app_profile_base_name = + browser->profile()->GetBaseName().AsUTF8Unsafe(); + if (!profile_base_name_.empty() && + profile_base_name_.AsUTF8Unsafe() != app_profile_base_name) { + continue; + } + base::Value web_app_info(base::Value::Type::DICTIONARY); + web_app_info.SetStringKey("id", browser->app_controller()->app_id()); + web_app_info.SetStringKey( + "name", + base::UTF16ToUTF8(browser->app_controller()->GetAppShortName())); + auto iter_and_inserted = open_apps.emplace( + app_profile_base_name, base::Value(base::Value::Type::LIST)); + iter_and_inserted.first->second.Append(std::move(web_app_info)); + } + base::Value open_apps_list(base::Value::Type::LIST); + for (auto& item : open_apps) { + base::Value item_info(base::Value::Type::DICTIONARY); + item_info.SetStringKey("profile_id", item.first); + item_info.SetKey("web_apps", std::move(item.second)); + open_apps_list.Append(std::move(item_info)); + } + return open_apps_list; +} + +void GetWebApps::OnProfileLoaded(base::RepeatingClosure callback, + Profile* profile) { + if (!profile) { + callback.Run(); + return; + } + profiles_.push_back(profile); + profiles_keep_alive_.push_back(std::make_unique( + profile, ProfileKeepAliveOrigin::kGettingWebAppInfo)); + web_app::WebAppProvider* web_app_provider = + web_app::WebAppProvider::GetForWebApps(profile); + web_app_provider->on_registry_ready().Post(FROM_HERE, std::move(callback)); +} + +void GetWebApps::FetchWebAppsAndWriteToDisk() { + base::Value apps_dict(base::Value::Type::DICTIONARY); + apps_dict.SetKey("installed_web_apps", GetInstalledWebApps()); + apps_dict.SetKey("open_web_apps", GetOpenWebApps()); + SerializeAndScheduleWrite(apps_dict); + // `this` is owned by the callback that calls this function, so it will be + // destroyed automatically after being run. +} + +} // namespace + +void WriteWebAppsToFile(const base::FilePath& output_file, + const base::FilePath& profile_base_name) { + GetWebApps::Start(output_file, profile_base_name); +} + +} // namespace startup +} // namespace chrome diff --git a/chrome/browser/ui/startup/web_app_info_recorder_utils.h b/chrome/browser/ui/startup/web_app_info_recorder_utils.h new file mode 100644 index 00000000000000..bad8ca9acd1ad6 --- /dev/null +++ b/chrome/browser/ui/startup/web_app_info_recorder_utils.h @@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_STARTUP_WEB_APP_INFO_RECORDER_UTILS_H_ +#define CHROME_BROWSER_UI_STARTUP_WEB_APP_INFO_RECORDER_UTILS_H_ + +namespace base { +class FilePath; +} + +namespace chrome { +namespace startup { + +// Writes open and installed web apps for a given profile if +// `profile_base_name` is not empty, or for all profiles otherwise to the +// `output_file`. +void WriteWebAppsToFile(const base::FilePath& output_file, + const base::FilePath& profile_base_name); + +} // namespace startup +} // namespace chrome + +#endif // CHROME_BROWSER_UI_STARTUP_WEB_APP_INFO_RECORDER_UTILS_H_ diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index e3399125e50bdf..a579e1118c23ab 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc @@ -41,7 +41,6 @@ #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h" #include "chrome/browser/ui/web_applications/web_app_launch_utils.h" #include "chrome/browser/ui/web_applications/web_app_menu_model.h" -#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" #include "chrome/browser/web_applications/manifest_update_manager.h" #include "chrome/browser/web_applications/policy/web_app_policy_constants.h" #include "chrome/browser/web_applications/policy/web_app_policy_manager.h" @@ -77,6 +76,8 @@ #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h" #include "components/services/app_service/public/mojom/types.mojom-shared.h" +#else +#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" #endif #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -105,6 +106,7 @@ const base::flat_map g_site_mode_to_path = { {"SiteAFoo", "site_a/foo"}, {"SiteABar", "site_a/bar"}}; +#if !defined(OS_CHROMEOS) class TestAppLauncherHandler : public AppLauncherHandler { public: TestAppLauncherHandler(extensions::ExtensionService* extension_service, @@ -116,6 +118,7 @@ class TestAppLauncherHandler : public AppLauncherHandler { set_web_ui(test_web_ui); } }; +#endif class BrowserAddedWaiter final : public BrowserListObserver { public: @@ -460,6 +463,7 @@ void WebAppIntegrationTestDriver::InstallMenuOption( AfterStateChangeAction(); } +#if !defined(OS_CHROMEOS) void WebAppIntegrationTestDriver::InstallLocally(const std::string& site_mode) { BeforeStateChangeAction(); absl::optional app_state = GetAppBySiteMode( @@ -481,6 +485,7 @@ void WebAppIntegrationTestDriver::InstallLocally(const std::string& site_mode) { observer.Wait(); AfterStateChangeAction(); } +#endif void WebAppIntegrationTestDriver::InstallOmniboxIcon( const std::string& site_mode) { diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui.cc b/chrome/browser/ui/webui/ntp/new_tab_ui.cc index 53a3c208040441..6ea7e26ea99260 100644 --- a/chrome/browser/ui/webui/ntp/new_tab_ui.cc +++ b/chrome/browser/ui/webui/ntp/new_tab_ui.cc @@ -14,7 +14,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" #include "chrome/browser/ui/webui/ntp/cookie_controls_handler.h" #include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h" #include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h" @@ -35,6 +34,10 @@ #include "ui/native_theme/native_theme.h" #include "url/gurl.h" +#if !defined(OS_CHROMEOS) +#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" +#endif + namespace { // Strings sent to the page via jstemplates used to set the direction of the @@ -86,7 +89,9 @@ NewTabUI::~NewTabUI() {} void NewTabUI::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { CoreAppLauncherHandler::RegisterProfilePrefs(registry); +#if !defined(OS_CHROMEOS) AppLauncherHandler::RegisterProfilePrefs(registry); +#endif } // static diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc index e9f89005b40e06..a1efa187297107 100644 --- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc +++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc @@ -25,7 +25,6 @@ #include "chrome/browser/ui/cookie_controls/cookie_controls_service.h" #include "chrome/browser/ui/cookie_controls/cookie_controls_service_factory.h" #include "chrome/browser/ui/layout_constants.h" -#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" #include "chrome/browser/ui/webui/ntp/cookie_controls_handler.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/buildflags.h" @@ -60,6 +59,10 @@ #include "chromeos/strings/grit/chromeos_strings.h" #endif +#if !defined(OS_CHROMEOS) +#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" +#endif + using content::BrowserThread; namespace { diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index d080071d6b66e7..638b0ce4ee926d 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt @@ -1 +1 @@ -chrome-linux-main-1639677539-99948628de3a78f947b1b4d59843ea500cf91b69.profdata +chrome-linux-main-1639699149-aee8fe56defa7d21b46b0aa9aaaef8430ddf4fb5.profdata diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 459c95319e2c09..37ca62a6b2aabf 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt @@ -1 +1 @@ -chrome-mac-main-1639677539-997cb311ab2c03187a535e6bd85a4c81ef7ed1a7.profdata +chrome-mac-main-1639699149-d99607dd6ede6953e9a8a370b4b194cf85698800.profdata diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 8e5ee8c1cdbf6f..9006f405966d70 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt @@ -1 +1 @@ -chrome-win32-main-1639677539-d3b89857331ec31b3fb9a2f0baec586c99a0d583.profdata +chrome-win32-main-1639699149-21d03dd9629015aa4c6c0780ad4efa7b76563a12.profdata diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 3b2ce47e56f3a2..3d48bdf832a139 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -808,6 +808,18 @@ const char kEnableNewAppMenuIcon[] = "enable-new-app-menu-icon"; const char kGuest[] = "guest"; #endif +#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) +// Writes open and installed web apps for each profile to the specified file +// without launching a new browser window or tab. Pass a absolute file path to +// specify where to output the information. Can be used together with optional +// --profile-base-name switch to only write information for a given profile. +const char kListApps[] = "list-apps"; + +// Pass the basename of the profile directory to specify which profile to get +// information. Only relevant when used with --list-apps switch. +const char kProfileBaseName[] = "profile-base-name"; +#endif + #if BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_ANDROID) // Custom WebAPK server URL for the sake of testing. const char kWebApkServerUrl[] = "webapk-server-url"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index f68f68eaea64fd..929eb5bcd3776c 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -254,6 +254,11 @@ extern const char kEnableNewAppMenuIcon[]; extern const char kGuest[]; #endif +#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) +extern const char kListApps[]; +extern const char kProfileBaseName[]; +#endif + #if BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_ANDROID) extern const char kWebApkServerUrl[]; #endif diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 7e90011db26f76..b158c12b0c784c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn @@ -5078,7 +5078,6 @@ test("unit_tests") { "../browser/ui/webui/discards/graph_dump_impl_unittest.cc", "../browser/ui/webui/favicon_source_unittest.cc", "../browser/ui/webui/history_clusters/history_clusters_handler_unittest.cc", - "../browser/ui/webui/ntp/app_launcher_handler_unittest.cc", "../browser/ui/webui/signin/sync_confirmation_handler_unittest.cc", "../browser/upgrade_detector/build_state_unittest.cc", "../browser/upgrade_detector/mock_build_state_observer.cc", @@ -5113,6 +5112,10 @@ test("unit_tests") { sources += [ "../test/pixel/browser_skia_gold_pixel_diff_unittest.cc" ] } + if (is_win || is_mac || is_linux) { + sources += [ "../browser/ui/webui/ntp/app_launcher_handler_unittest.cc" ] + } + if (enable_webui_tab_strip) { sources += [ "../browser/ui/views/toolbar/webui_tab_counter_button_unittest.cc", diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js index 23f7ed7255fedd..7417e269098c91 100644 --- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js @@ -13,6 +13,7 @@ // #import {assertTrue, assertEquals, assertFalse} from '../../../chai_assert.js'; // #import {createDefaultBluetoothDevice, FakeBluetoothConfig} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js'; // #import {setBluetoothConfigForTesting} from 'chrome://resources/cr_components/chromeos/bluetooth/cros_bluetooth_config.js'; +// #import {waitAfterNextRender} from 'chrome://test/test_util.js'; // clang-format on suite('OsBluetoothDeviceDetailPageTest', function() { @@ -67,6 +68,55 @@ suite('OsBluetoothDeviceDetailPageTest', function() { settings.Router.getInstance().resetRouteForTesting(); }); + + test( + 'Error text is not shown after navigating away from page', + async function() { + init(); + bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); + + const getBluetoothConnectDisconnectBtn = () => + bluetoothDeviceDetailPage.$$('#connectDisconnectBtn'); + const getConnectionFailedText = () => + bluetoothDeviceDetailPage.$$('#connectionFailed'); + + const id = '12345/6789&'; + const device1 = createDefaultBluetoothDevice( + id, + /*publicName=*/ 'BeatsX', + /*connectionState=*/ + chromeos.bluetoothConfig.mojom.DeviceConnectionState.kNotConnected, + /*opt_nickname=*/ 'device1', + /*opt_audioCapability=*/ + mojom.AudioOutputCapability.kCapableOfAudioOutput, + /*opt_deviceType=*/ mojom.DeviceType.kMouse); + + device1.deviceProperties.batteryInfo = { + defaultProperties: {batteryPercentage: 90} + }; + + bluetoothConfig.appendToPairedDeviceList([device1]); + await flushAsync(); + + const params = new URLSearchParams(); + params.append('id', id); + settings.Router.getInstance().navigateTo( + settings.routes.BLUETOOTH_DEVICE_DETAIL, params); + + await flushAsync(); + + // Try to connect. + getBluetoothConnectDisconnectBtn().click(); + await flushAsync(); + bluetoothConfig.completeConnect(/*success=*/ false); + await flushAsync(); + assertTrue(!!getConnectionFailedText()); + + settings.Router.getInstance().navigateToPreviousRoute(); + await test_util.waitAfterNextRender(bluetoothDeviceDetailPage); + assertFalse(!!getConnectionFailedText()); + }); + test('Managed by enterprise icon', async function() { init(); bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); @@ -452,6 +502,19 @@ suite('OsBluetoothDeviceDetailPageTest', function() { // Connection fails. await flushAsync(); + // Disconnected with error. + assertUIState( + /*isShowingConnectionFailed=*/ true, + /*isConnectDisconnectBtnDisabled=*/ false, + /*bluetoothStateText=*/ + bluetoothDeviceDetailPage.i18n('bluetoothDeviceDetailDisconnected'), + /*connectDisconnectBtnText=*/ + bluetoothDeviceDetailPage.i18n('bluetoothConnect')); + + // Change device while connection failed text is shown. + bluetoothConfig.appendToPairedDeviceList([Object.assign({}, device1)]); + await flushAsync(); + // Disconnected with error. assertUIState( /*isShowingConnectionFailed=*/ true, diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index dd17d422e4ccfa..71f1a524f5bc27 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb @@ -117,6 +117,7 @@ Chrome OS üzrə yeniliklər Gündəlik Yenilənmə Sistem +8 simvoldan ibarət kilid açma kodunu daxil edin Ok EAP Faza 2 doğrulaması KEÇDİ diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 3f932f3a19a97e..6b92bcf38bbf3a 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb @@ -117,6 +117,7 @@ Novosti Chrome OS-a Dnevno osvježavanje Sistem +Unesite osmeroznamenkasti kôd za otključavanje. Uredu EAP faza 2 autentifikacije USPJEŠNO diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 5d20fa38dfb44b..9ada9d49794ac6 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb @@ -117,6 +117,7 @@ Πληρ. ενημέρ. Chrome OS Ημερήσια ανανέωση Σύστημα +Εισαγάγετε τον κωδικό ξεκλειδώματος 8 χαρακτήρων ΟK 2η φάση ελέγχου ταυτότητας EAP: ΕΠΙΤΥΧΗΣ ΟΛΟΚΛΗΡΩΣΗ diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index d8765089e13a78..14ab3920010fcb 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb @@ -117,6 +117,7 @@ What's new with Chrome OS Daily Refresh System +Enter the 8-character unlock code OK EAP Phase 2 authentication PASSED diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index f600d7a8f898ed..e00865a2acc795 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb @@ -117,6 +117,7 @@ Novo u OS-u Chrome Dnevno osvježavanje Sustav +Unesite osmeroznamenkasti kôd za otključavanje. U redu 2. faza autentifikacije za EAP USPJEŠNO diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index de9d6a0e2724cd..39985fde4db358 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb @@ -117,6 +117,7 @@ Novità di Chrome OS Aggiornam. quotidiano Sistema +Inserisci il codice di sblocco di 8 caratteri OK Autenticazione fase 2 di tipo EAP SUPERATO diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index 898fe1ba2e506c..58bc159427bf91 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb @@ -117,6 +117,7 @@ Што е ново во Chrome OS Дневно освежување Систем +Внесете го 8-цифрениот код за отклучување Во ред Автентикација со EAP во фаза 2 УСПЕШЕН diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 5ffa4421f67a4d..d96724412c8ed0 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb @@ -117,6 +117,7 @@ Chrome OS-ൽ പുതിയത് പ്രതിദിന റീഫ്രഷ് ചെയ്യൽ സിസ്റ്റം +8 പ്രതീകങ്ങളുള്ള അൺലോക്ക് കോഡ് നൽകുക ശരി രണ്ടാം ഘട്ട EAP പരിശോധിച്ചുറപ്പിക്കൽ വിജയിച്ചു diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index f9bce7f1bbf1ac..9247b6694319c7 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb @@ -117,6 +117,7 @@ Nieuw bij Chrome OS Dagelijks vernieuwen Systeem +Geef de ontgrendelingscode van 8 tekens op OK EAP Phase 2-verificatie GESLAAGD diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index bacfdd96119938..945783a3d68cd9 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb @@ -117,6 +117,7 @@ Co nowego w Chrome OS Codziennie nowa System +Wpisz 8-znakowy kod odblokowania OK Uwierzytelnianie EAP Phase 2 ZALICZONY diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 9eff64db57295e..985231cdc2e41b 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb @@ -117,6 +117,7 @@ Novidades do Chrome OS Atualização diária Sistema +Digite o código de desbloqueio de oito caracteres Ok Autenticação EAP Fase 2 APROVADO diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index d3cab452c9612e..fc918a74373ebf 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb @@ -117,6 +117,7 @@ Novo u vezi Chrome OS-a Dnevno osvežavanje Sistem +Unesite kôd za otključavanje od 8 znakova Potvrdi EAP potvrda identiteta 2. faze: PROŠLO diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 732c1fe57dac64..5f8b023de63087 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb @@ -117,6 +117,7 @@ Ново у вези Chrome ОС-а Дневно освежавање Систем +Унесите кôд за откључавање од 8 знакова Потврди EAP потврда идентитета 2. фазе: ПРОШЛО diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index 4cdcebe70a3e22..2d70098d65f93f 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb @@ -117,6 +117,7 @@ Nyheter i Chrome OS Daglig uppdatering System +Ange koden för upplåsning som består av åtta tecken OK Fas 2 i EAP-autentisering SLUTFÖRT diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index 5d8b094ad06921..564986f15e9559 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb @@ -117,6 +117,7 @@ Chrome OSలో కొత్తవి ఏంటి రోజూ రిఫ్రెష్ అవుతుంది సిస్టమ్ +8-అక్షరాల అన్‌లాక్ కోడ్‌ను ఎంటర్ చేయండి సరే EAP 2వ దశ ప్రమాణీకరణ ఉత్తీర్ణత సాధించాయి diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 9125e21f44f1cd..0fc403084365bc 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni @@ -99,6 +99,7 @@ tast_disabled_tests_from_chrome_all = [ # https://crbug.com/1273485: Flaky. "printer.ProxyAdd.epson_software_collate", + "printer.ProxyAdd.epson_software_uncollated", # https://crbug.com/1279285: Flaky. "policy.AllowWakeLocks", diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index 1cf08e07279ade..e953000904aa48 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb @@ -49,6 +49,7 @@ Laat webkoekies toe Om toegang tot jou kamera te gee, moet jy kamera ook in Android-instellings aanskakel. Net een keer + Verwyder Vra wanneer 'n werf Bluetooth-toestelle in die omtrek wil ontdek (aanbeveel) Bedryfstelsel steun nie die sertifikaat wat die kliënt gekies het nie. Gaan voort diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb index 8dd96def87f7f9..3ed9e09e0e5c30 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb @@ -49,6 +49,7 @@ Дазволіць файлы cookie Каб праграма "" атрымала доступ да камеры, уключыце камеру таксама ў Наладах Android. Толькі адзін раз +Выдаліць: Пытацца, калі сайт спрабуе выявіць прылады Bluetooth паблізу (рэкамендуецца) Аперацыйная сістэма не падтрымлівае выбар сертыфіката кліента. Працягнуць diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb index a1fd9b82d363e4..f82b4b11c54ae6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb @@ -49,6 +49,7 @@ Povolit cookies Pokud aplikaci chcete umožnit přístup k fotoaparátu, zapněte fotoaparát také v Nastavení Android. Pouze jednou +Odstranit položku Zeptat se, když chce web objevit zařízení Bluetooth v okolí (doporučeno) Volbu certifikátu na straně klienta operační systém nepodporuje. Pokračovat diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index 157d9557be0b1c..843eba0cc0a258 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb @@ -49,6 +49,7 @@ Tillad cookies Aktivér også dit kamera i Android-indstillingerne for at give adgang til kameraet. Kun én gang +Fjern Spørg, når et website vil søge efter Bluetooth-enheder i nærheden (anbefalet) Klientens certifikatvalg understøttes ikke af operativsystemet. Fortsæt diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb index a99ee780e66645..1815e13da5a0a3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb @@ -49,6 +49,7 @@ Cookies zulassen Um Zugriff auf Ihre Kamera zu gewähren, muss die Kameraberechtigung auch in den Android-Einstellungen aktiviert werden. Nur einmal + entfernen Nachfragen, wenn eine Website nach Bluetooth-Geräten in der Nähe suchen möchte (empfohlen) Die clientseitige Zertifikatauswahl wird vom Betriebssystem nicht unterstützt. Weiter diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb index 801022ba2a3d61..453942dfb060e6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb @@ -49,6 +49,7 @@ Permitir cookies Para permitir que acceda a tu cámara, actívala también en la Configuración de Android. Solo esta vez +Quitar Preguntarme cuando un sitio intente conectarse a dispositivos Bluetooth cercanos (recomendado) El sistema operativo no admite la selección de certificados del lado del cliente. Continuar diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index 8fdcc43fd36388..6a090e3e609dc5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb @@ -49,6 +49,7 @@ Permitir cookies Para que pueda acceder a tu cámara, activa la cámara también en los ajustes de Android. Solo una vez + Eliminar Preguntar cuando un sitio web quiera buscar dispositivos Bluetooth cercanos (recomendado) El sistema operativo no admite la selección de certificados de cliente. Continuar diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index c9ca1c756e4189..decdaf961a2d71 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb @@ -49,6 +49,7 @@ Luba küpsisefailid Selleks et anda rakendusele juurdepääs teie kaamerale, lülitage kaamera sisse ka Androidi seadetes. Ainult ühe korra + Eemalda Küsi, kui sait soovib läheduses asuvaid Bluetoothi seadmeid tuvastada (soovitatav) Operatsioonisüsteem ei toeta kliendipoolset sertifikaadi valimist. Jätka diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index 481043abaaa8ac..2c7a13152c3135 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb @@ -49,6 +49,7 @@ Salli evästeet Laita kamera päälle myös Androidin asetuksista, jotta saa pääsyn kameraasi. Vain kerran +Poista Kysy aina, kun sivusto pyytää lupaa löytää lähellä olevat Bluetooth-laitteet (suositus) Käyttöjärjestelmä ei tue palvelimen varmennevalintaa. Jatka diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb index 2271c422e1bf8e..2ee8bf41a3542e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb @@ -49,6 +49,7 @@ Autoriser les cookies Pour autoriser à accéder à votre caméra, activez-la également dans les paramètres Android. Une seule fois +Supprimer Me demander lorsqu'un site souhaite accéder aux appareils Bluetooth se trouvant à proximité (recommandé) La sélection de certificat côté client n'est pas compatible avec le système d'exploitation. Continuer diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index d6f48eb10722d0..c0e02b4c70dd0b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb @@ -49,6 +49,7 @@ Dopusti kolačiće Da bi aplikacija mogla pristupiti vašoj kameri, uključite kameru i u Androidovim postavkama. Samo jednom +Ukloni Prikaži upit kad web-lokacija želi tražiti Bluetooth uređaje u blizini (preporučeno) Operativni sustav ne podržava odabir klijentskog certifikata. Nastavi diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index 872fd1829ec4a2..66d38f28a00f55 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb @@ -49,6 +49,7 @@ Izinkan cookie Untuk mengizinkan mengakses kamera Anda, aktifkan juga kamera di Setelan Android. Sekali ini saja +Hapus Tanyakan saat situs ingin menemukan perangkat Bluetooth di sekitar (direkomendasikan) Pilihan sertifikat sisi klien tidak didukung oleh sistem operasi. Lanjutkan diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index 6f02ea03d33780..583ffa215ca741 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb @@ -49,6 +49,7 @@ Consenti cookie Per consentire all'app di accedere alla fotocamera, attiva la fotocamera anche nelle Impostazioni Android. Solo una volta +Rimuovi Chiedi conferma quando un sito vuole rilevare i dispositivi Bluetooth nelle vicinanze (opzione consigliata) La selezione del certificato lato client non è supportata dal sistema operativo. Continua diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index a498a6875125db..69f797f8734dc7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb @@ -49,6 +49,7 @@ ‏אישור קובצי cookie ‏כדי לאפשר ל- לגשת אל המצלמה, צריך להפעיל אותה גם בהגדרות Android. פעם אחת בלבד +הסרה של ‏המערכת מבקשת אישור כשאתר רוצה לאתר התקני Bluetooth קרובים (מומלץ) מערכת ההפעלה אינה תומכת בבחירת אישור בצד הלקוח. המשך diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index efcc10ac616cf3..30e7abf63ba51f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb @@ -49,6 +49,7 @@ 쿠키 허용 에서 카메라에 액세스하도록 허용하려면 Android 설정에서도 카메라를 사용 설정하세요. 한 번만 + 삭제 사이트가 주변 블루투스 기기를 조회하려고 할 때 확인(권장) 클라이언트측 인증서 선택이 운영체제에서 지원되지 않습니다. 계속 diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb index 60c9666f01c1d9..5de3c88a4e7c57 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb @@ -49,6 +49,7 @@ Atļaut sīkfailus Lai atļautu lietotnei piekļūt jūsu kamerai, ieslēdziet kameru arī Android iestatījumos. Tikai vienreiz +Noņemt vienumu “ Vaicāt, ja vietne vēlas redzēt tuvumā esošās Bluetooth ierīces (ieteicams) Operētājsistēma neatbalsta klienta puses sertifikāta atlasi. Turpināt diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index 968c5e7a2658bb..d9574e8b4bd210 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb @@ -49,6 +49,7 @@ Benarkan kuki Untuk membolehkan mengakses kamera anda, hidupkan juga kamera dalam Tetapan Android. Hanya sekali +Alih keluar Tanya apabila tapak mahu mencari peranti Bluetooth berdekatan (disyorkan) Pemilihan sijil pihak pelanggan tidak disokong oleh sistem pengendalian ini. Teruskan diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb index 9e1e1f7baa3706..eefdfeb46b6419 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb @@ -49,6 +49,7 @@ Cookies toestaan Als je toegang wilt geven tot je camera, moet je de camera ook aanzetten via de Android-instellingen. Slechts één keer + verwijderen Vragen wanneer een site Bluetooth-apparaten in de buurt wilt detecteren (aanbevolen) Certificaatselectie aan clientzijde wordt niet ondersteund door het besturingssysteem. Doorgaan diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb index 4c1a06c2061523..0ba9239b507565 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb @@ -49,6 +49,7 @@ କୁକୀଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ କୁ ଆପଣଙ୍କ କ୍ୟାମେରା ଆକ୍ସେସ୍ ଦେବା ପାଇଁ, Android ସେଟିଂସରେ କ୍ୟାମେରା ମଧ୍ୟ ଚାଲୁ କରନ୍ତୁ। ଥରେ ମାତ୍ର +କୁ କାଢ଼ି ଦିଅନ୍ତୁ ଯେତେବେଳେ ଏକ ସାଇଟ୍ ଆଖପାଖର ବ୍ଲୁଟୂଥ୍ ଡିଭାଇସ୍‍ଗୁଡ଼ିକୁ ଖୋଜିବାକୁ ଚାହୁଁଛି, ସେତେବେଳେ ପଚାରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି) କ୍ଲାଏଣ୍ଟ ସାଇଡ୍ ସାର୍ଟିଫିକେଟ୍ ଚୟନ ଅପରେଟିଂ ସିଷ୍ଟମ୍‍ ଦ୍ବାରା ସପୋର୍ଟ କରୁନାହିଁ। ଜାରି ରଖନ୍ତୁ diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index d3799cec0a785e..46ccda6c567cd2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb @@ -49,6 +49,7 @@ ਕੁਕੀਜ਼ ਨੂੰ ਆਗਿਆ ਦਿਓ ਨੂੰ ਆਪਣੇ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣ ਲਈ, Android ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਕੈਮਰਾ ਵੀ ਚਾਲੂ ਕਰੋ। ਸਿਰਫ ਇੱਕ ਵਾਰ + ਹਟਾਓ ਕਿਸੇ ਸਾਈਟ ਵੱਲੋਂ ਨਜ਼ਦੀਕੀ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵੇਲੇ ਪੁੱਛੋ (ਸਿਫ਼ਾਰਸ਼ੀ) ਕਲਾਈਂਟ ਵੱਲੋਂ ਕੀਤੀ ਗਈ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਦੀ ਚੋਣ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਵੱਲੋਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ। ਜਾਰੀ ਰੱਖੋ diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index bef3e19146869e..4c106704451b16 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb @@ -49,6 +49,7 @@ Zezwalaj na pliki cookie Aby zezwolić aplikacji na dostęp do aparatu, musisz go też włączyć w Ustawieniach Androida. Tylko raz +Usuń Pytaj, gdy strona chce wykryć urządzenia Bluetooth w pobliżu (zalecane) Wybieranie certyfikatu klienta nie jest obsługiwane przez ten system operacyjny. Dalej diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index 1b352b4eee3c02..2191c292b5f342 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb @@ -49,6 +49,7 @@ Разрешить файлы cookie Чтобы у приложения "" был доступ к камере, включите ее в настройках Android. Однократно +Удалить пункт "" Запрашивать для сайтов разрешение на поиск Bluetooth-устройств поблизости (рекомендуется) Сертификат, выбранный клиентом, не поддерживается операционной системой. Продолжить diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb index a14da8151868dc..f775a9acd35120 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb @@ -49,6 +49,7 @@ Dovoli piškotke Če želite aplikaciji omogočiti dostop do fotoaparata, fotoaparat vklopite tudi v nastavitvah za Android. Samo enkrat + Odstrani Vprašaj, ko želi spletno mesto odkrivati naprave Bluetooth v bližini (priporočljivo) Operacijski sistem ne podpira izbire potrdila pri odjemalcu. Naprej diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb index 4ed7fc5ba10bc5..d1882911baa519 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb @@ -49,6 +49,7 @@ Lejo kukit Për të lejuar që të ketë qasje te kamera jote, aktivizo gjithashtu kamerën në Cilësimet e Android. Vetëm një herë + - Hiq Pyet kur një sajt dëshiron të zbulojë pajisjet Bluetooth në afërsi (rekomandohet) Përzgjedhja e certifikatës nga ana e klientit nuk mbështetet nga sistemi operativ. Vazhdo diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index b3e4f3b1c7fb78..5e726aff35c57a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb @@ -49,6 +49,7 @@ குக்கீகளை அனுமதி உங்கள் கேமராவை அணுக ஆப்ஸை அனுமதிப்பதற்கு Android அமைப்புகளிலும் கேமராவிற்கான அனுமதியை இயக்கவும். ஒருமுறை மட்டுமே + ஐ அகற்றும் அருகிலுள்ள புளூடூத் சாதனங்களை வலைதளம் கண்டறிய முயலும்போது கேள் (பரிந்துரைக்கப்படுகிறது) கிளையன்ட் சார்பாக சான்றிதழ் தேர்ந்தெடுப்பை ஆப்ரேட்டிங் சிஸ்டம் ஆதரிக்கவில்லை. தொடர்க diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 0f52178eacf6bd..26ab7b503158ed 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb @@ -49,6 +49,7 @@ Дозволити файли cookie Щоб надати додатку доступ до камери, також увімкніть її в налаштуваннях Android. Лише цього разу +Видалити Запитувати, коли сайт хоче шукати пристрої Bluetooth поблизу (рекомендовано) Операційна система не підтримує сертифікат, вибраний на стороні клієнта. Продовжити diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index 15503a1df313eb..f39110b33df493 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb @@ -49,6 +49,7 @@ Cho phép cookie Để cho phép truy cập vào máy ảnh của bạn, hãy bật cả máy ảnh trong phần Cài đặt Android. Chỉ một lần + Xoá Hỏi khi một trang web muốn tìm các thiết bị Bluetooth ở gần (khuyên dùng) Lựa chọn chứng chỉ phía ứng dụng khách không được hệ điều hành hỗ trợ. Tiếp tục diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn index 08fb7695b1036a..a8dcf9e4063068 100644 --- a/components/browser_ui/styles/android/BUILD.gn +++ b/components/browser_ui/styles/android/BUILD.gn @@ -23,14 +23,11 @@ android_library("java") { android_resources("java_resources") { sources = [ - "java/res/color-v29/default_control_color_highlight.xml", "java/res/color/default_icon_color_accent1_tint_list.xml", - "java/res/color/default_icon_color_dark_tint_list.xml", "java/res/color/default_icon_color_light_tint_list.xml", "java/res/color/default_icon_color_secondary_light_tint_list.xml", "java/res/color/default_icon_color_secondary_tint_list.xml", "java/res/color/default_icon_color_tint_list.xml", - "java/res/color/default_icon_color_white_tint_list.xml", "java/res/color/default_text_color_accent1_tint_list.xml", "java/res/color/default_text_color_disabled_list.xml", "java/res/color/default_text_color_hint_list.xml", diff --git a/components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml b/components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml deleted file mode 100644 index 83d9240370b2b0..00000000000000 --- a/components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml b/components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml deleted file mode 100644 index bcb69a24caa581..00000000000000 --- a/components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/components/browser_ui/styles/android/java/res/values-night/colors.xml b/components/browser_ui/styles/android/java/res/values-night/colors.xml index b6b7e151fd56f1..5c5c4bbd2722c8 100644 --- a/components/browser_ui/styles/android/java/res/values-night/colors.xml +++ b/components/browser_ui/styles/android/java/res/values-night/colors.xml @@ -6,7 +6,5 @@ - - @color/default_control_color_highlight_dark - + @color/default_control_color_highlight_dark diff --git a/components/browser_ui/styles/android/java/res/values/colors.xml b/components/browser_ui/styles/android/java/res/values/colors.xml index 059e4132092a49..312a0b11d534bf 100644 --- a/components/browser_ui/styles/android/java/res/values/colors.xml +++ b/components/browser_ui/styles/android/java/res/values/colors.xml @@ -19,14 +19,9 @@ - + @color/default_control_color_highlight_light - - - @color/default_control_color_highlight_baseline - @color/default_control_color_normal_light diff --git a/components/browser_ui/styles/android/java/res/values/dimens.xml b/components/browser_ui/styles/android/java/res/values/dimens.xml index f78a9414a5ad4c..680676022f58f4 100644 --- a/components/browser_ui/styles/android/java/res/values/dimens.xml +++ b/components/browser_ui/styles/android/java/res/values/dimens.xml @@ -20,5 +20,4 @@ 0.2 0.2 - 0.1 diff --git a/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml b/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml index 656460013030d2..b7f3f27904f23b 100644 --- a/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml +++ b/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml @@ -8,7 +8,6 @@ ?attr/colorSurface ?attr/colorSurface ?attr/colorPrimary - @color/default_control_color_highlight ?attr/colorOnSurfaceVariant ?attr/colorOnSurface ?attr/colorPrimary @@ -23,7 +22,6 @@ @color/default_bg_color_baseline @color/default_bg_color_elev_0_baseline @color/default_control_color_active_baseline - @color/default_control_color_highlight_baseline @color/default_control_color_normal_baseline @color/default_icon_color_baseline @color/default_icon_color_accent1_baseline diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml index 1af4b85d230831..ab4e2a5b300019 100644 --- a/components/browser_ui/styles/android/java/res/values/styles.xml +++ b/components/browser_ui/styles/android/java/res/values/styles.xml @@ -102,7 +102,7 @@ @null 48dp @style/TextAppearance.TextLarge.Primary - @macro/default_control_color_highlight + @color/control_highlight_color diff --git a/components/feedback/feedback_uploader.cc b/components/feedback/feedback_uploader.cc index 791cc2673297a4..3a7e98c36d5ae5 100644 --- a/components/feedback/feedback_uploader.cc +++ b/components/feedback/feedback_uploader.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" +#include "base/metrics/histogram_macros.h" #include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -23,6 +24,17 @@ namespace feedback { namespace { +constexpr char kReportSendingResultHistogramName[] = + "Feedback.ReportSending.Result"; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class FeedbackReportSendingResult { + kSuccessAtFirstTry = 0, // The report was uploaded successfully without retry + kSuccessAfterRetry = 1, // The report was uploaded successfully after retry + kDropped = 2, // The report is corrupt or invalid and was dropped + kMaxValue = kDropped, +}; + constexpr base::FilePath::CharType kFeedbackReportPath[] = FILE_PATH_LITERAL("Feedback Reports"); @@ -111,6 +123,13 @@ void FeedbackUploader::StartDispatchingReport() { } void FeedbackUploader::OnReportUploadSuccess() { + if (retry_delay_ == g_minimum_retry_delay) { + UMA_HISTOGRAM_ENUMERATION(kReportSendingResultHistogramName, + FeedbackReportSendingResult::kSuccessAtFirstTry); + } else { + UMA_HISTOGRAM_ENUMERATION(kReportSendingResultHistogramName, + FeedbackReportSendingResult::kSuccessAfterRetry); + } retry_delay_ = g_minimum_retry_delay; is_dispatching_ = false; // Explicitly release the successfully dispatched report. @@ -128,6 +147,8 @@ void FeedbackUploader::OnReportUploadFailure(bool should_retry) { } else { // The report won't be retried, hence explicitly delete its file on disk. report_being_dispatched_->DeleteReportOnDisk(); + UMA_HISTOGRAM_ENUMERATION(kReportSendingResultHistogramName, + FeedbackReportSendingResult::kDropped); } // The report dispatching failed, and should either be retried or not. In all diff --git a/components/keep_alive_registry/keep_alive_types.cc b/components/keep_alive_registry/keep_alive_types.cc index 180fc476013cbd..ea9bc27f27f14f 100644 --- a/components/keep_alive_registry/keep_alive_types.cc +++ b/components/keep_alive_registry/keep_alive_types.cc @@ -36,6 +36,8 @@ std::ostream& operator<<(std::ostream& out, const KeepAliveOrigin& origin) { return out << "REMOTE_DEBUGGING"; case KeepAliveOrigin::DEVTOOLS_WINDOW: return out << "DEVTOOLS_WINDOW"; + case KeepAliveOrigin::NATIVE_MESSAGING_HOST_ERROR_REPORT: + return out << "NATIVE_MESSAGING_HOST_ERROR_REPORT"; case KeepAliveOrigin::NOTIFICATION: return out << "NOTIFICATION"; case KeepAliveOrigin::PENDING_NOTIFICATION_CLICK_EVENT: @@ -48,10 +50,6 @@ std::ostream& operator<<(std::ostream& out, const KeepAliveOrigin& origin) { return out << "APP_LIST_SERVICE_VIEWS"; case KeepAliveOrigin::APP_LIST_SHOWER: return out << "APP_LIST_SHOWER"; - case KeepAliveOrigin::APP_MANIFEST_UPDATE: - return out << "APP_MANIFEST_UPDATE"; - case KeepAliveOrigin::APP_START_URL_MIGRATION: - return out << "APP_START_URL_MIGRATION"; case KeepAliveOrigin::CHROME_APP_DELEGATE: return out << "CHROME_APP_DELEGATE"; case KeepAliveOrigin::CHROME_VIEWS_DELEGATE: @@ -68,10 +66,14 @@ std::ostream& operator<<(std::ostream& out, const KeepAliveOrigin& origin) { return out << "USER_MANAGER_VIEW"; case KeepAliveOrigin::CREDENTIAL_PROVIDER_SIGNIN_DIALOG: return out << "CREDENTIAL_PROVIDER_SIGNIN_DIALOG"; - case KeepAliveOrigin::NATIVE_MESSAGING_HOST_ERROR_REPORT: - return out << "NATIVE_MESSAGING_HOST_ERROR_REPORT"; case KeepAliveOrigin::WEB_APP_INTENT_PICKER: return out << "WEB_APP_INTENT_PICKER"; + case KeepAliveOrigin::APP_MANIFEST_UPDATE: + return out << "APP_MANIFEST_UPDATE"; + case KeepAliveOrigin::APP_START_URL_MIGRATION: + return out << "APP_START_URL_MIGRATION"; + case KeepAliveOrigin::APP_GET_INFO: + return out << "APP_GET_INFO"; case KeepAliveOrigin::SESSION_DATA_DELETER: return out << "SESSION_DATA_DELETER"; } diff --git a/components/keep_alive_registry/keep_alive_types.h b/components/keep_alive_registry/keep_alive_types.h index bcb4867cdef621..995701795fbfa1 100644 --- a/components/keep_alive_registry/keep_alive_types.h +++ b/components/keep_alive_registry/keep_alive_types.h @@ -67,6 +67,7 @@ enum class KeepAliveOrigin { // c/b/web_applications APP_MANIFEST_UPDATE, APP_START_URL_MIGRATION, + APP_GET_INFO, // c/b/sessions SESSION_DATA_DELETER, diff --git a/components/metrics/clean_exit_beacon.cc b/components/metrics/clean_exit_beacon.cc index 64820d74098336..c33394db361c44 100644 --- a/components/metrics/clean_exit_beacon.cc +++ b/components/metrics/clean_exit_beacon.cc @@ -122,6 +122,12 @@ void MaybeIncrementCrashStreak(bool did_previous_session_exit_cleanly, base::clamp(num_crashes, 0, 100)); } +// Records |file_state| in a histogram. +void RecordBeaconFileState(BeaconFileState file_state) { + base::UmaHistogramEnumeration( + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", file_state); +} + // Returns the contents of the file at |beacon_file_path| if the following // conditions are all true. Otherwise, returns nullptr. // @@ -143,23 +149,34 @@ std::unique_ptr MaybeGetFileContents( if (beacon_file_path.empty()) return nullptr; + int error_code; JSONFileValueDeserializer deserializer(beacon_file_path); - std::unique_ptr beacon_file_contents = deserializer.Deserialize( - /*error_code=*/nullptr, /*error_message=*/nullptr); - - bool got_beacon_file_contents = - beacon_file_contents && beacon_file_contents->is_dict() && - beacon_file_contents->FindKeyOfType(kVariationsCrashStreak, - base::Value::Type::INTEGER) && - beacon_file_contents->FindKeyOfType(prefs::kStabilityExitedCleanly, - base::Value::Type::BOOLEAN); - base::UmaHistogramBoolean( - "Variations.ExtendedSafeMode.GotVariationsFileContents", - got_beacon_file_contents); - - if (got_beacon_file_contents) - return beacon_file_contents; - return nullptr; + std::unique_ptr beacon_file_contents = + deserializer.Deserialize(&error_code, /*error_message=*/nullptr); + + if (!beacon_file_contents) { + RecordBeaconFileState(BeaconFileState::kNotDeserializable); + base::UmaHistogramSparse( + "Variations.ExtendedSafeMode.BeaconFileDeserializationError", + error_code); + return nullptr; + } + if (!beacon_file_contents->is_dict() || beacon_file_contents->DictEmpty()) { + RecordBeaconFileState(BeaconFileState::kMissingDictionary); + return nullptr; + } + if (!beacon_file_contents->FindKeyOfType(kVariationsCrashStreak, + base::Value::Type::INTEGER)) { + RecordBeaconFileState(BeaconFileState::kMissingCrashStreak); + return nullptr; + } + if (!beacon_file_contents->FindKeyOfType(prefs::kStabilityExitedCleanly, + base::Value::Type::BOOLEAN)) { + RecordBeaconFileState(BeaconFileState::kMissingBeacon); + return nullptr; + } + RecordBeaconFileState(BeaconFileState::kReadable); + return beacon_file_contents; } // Returns the channel to use for setting up the Extended Variations Safe Mode diff --git a/components/metrics/clean_exit_beacon.h b/components/metrics/clean_exit_beacon.h index b0a5776c04814a..2118c99756fc2c 100644 --- a/components/metrics/clean_exit_beacon.h +++ b/components/metrics/clean_exit_beacon.h @@ -22,6 +22,9 @@ namespace metrics { // Captures all possible beacon value permutations for two distinct beacons. // Exposed for testing. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. enum class CleanExitBeaconConsistency { kCleanClean = 0, kCleanDirty = 1, @@ -35,6 +38,19 @@ enum class CleanExitBeaconConsistency { kMaxValue = kMissingMissing, }; +// Denotes the state of the beacon file. Exposed for testing. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class BeaconFileState { + kReadable = 0, + kNotDeserializable = 1, + kMissingDictionary = 2, + kMissingCrashStreak = 3, + kMissingBeacon = 4, + kMaxValue = kMissingBeacon, +}; + // Reads and updates a beacon used to detect whether the previous browser // process exited cleanly. class CleanExitBeacon { diff --git a/components/metrics/clean_exit_beacon_unittest.cc b/components/metrics/clean_exit_beacon_unittest.cc index c55dd30cdcb7c5..aa8068b92be71f 100644 --- a/components/metrics/clean_exit_beacon_unittest.cc +++ b/components/metrics/clean_exit_beacon_unittest.cc @@ -90,6 +90,7 @@ struct BadBeaconTestParams { const std::string test_name; bool beacon_file_exists; const std::string beacon_file_contents; + BeaconFileState beacon_file_state; }; // Used for testing beacon files that are not well-formed, do not exist, etc. @@ -182,7 +183,7 @@ TEST_F(CleanExitBeaconTest, InitWithoutUserDataDir) { EXPECT_FALSE( base::FieldTrialList::IsTrialActive(variations::kExtendedSafeModeTrial)); histogram_tester_.ExpectTotalCount( - "Variations.ExtendedSafeMode.GotVariationsFileContents", 0); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", 0); } // Verify that the beacon file is not read when the client is not in the @@ -217,41 +218,51 @@ TEST_F(CleanExitBeaconTest, FileIgnoredByControlGroup) { EXPECT_EQ(prefs_.GetInteger(variations::prefs::kVariationsCrashStreak), expected_crash_streak); histogram_tester_.ExpectTotalCount( - "Variations.ExtendedSafeMode.GotVariationsFileContents", 0); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", 0); } INSTANTIATE_TEST_SUITE_P( All, BadBeaconFileTest, ::testing::Values( - BadBeaconTestParams{.test_name = "NoVariationsFile", - .beacon_file_exists = false, - .beacon_file_contents = ""}, - BadBeaconTestParams{.test_name = "EmptyVariationsFile", - .beacon_file_exists = true, - .beacon_file_contents = ""}, - BadBeaconTestParams{.test_name = "NotDictionary", - .beacon_file_exists = true, - .beacon_file_contents = "{abc123"}, - BadBeaconTestParams{.test_name = "EmptyDictionary", - .beacon_file_exists = true, - .beacon_file_contents = "{}"}, + BadBeaconTestParams{ + .test_name = "NoVariationsFile", + .beacon_file_exists = false, + .beacon_file_contents = "", + .beacon_file_state = BeaconFileState::kNotDeserializable}, + BadBeaconTestParams{ + .test_name = "EmptyVariationsFile", + .beacon_file_exists = true, + .beacon_file_contents = "", + .beacon_file_state = BeaconFileState::kNotDeserializable}, + BadBeaconTestParams{ + .test_name = "NotDictionary", + .beacon_file_exists = true, + .beacon_file_contents = "{abc123", + .beacon_file_state = BeaconFileState::kNotDeserializable}, + BadBeaconTestParams{ + .test_name = "EmptyDictionary", + .beacon_file_exists = true, + .beacon_file_contents = "{}", + .beacon_file_state = BeaconFileState::kMissingDictionary}, BadBeaconTestParams{ .test_name = "MissingCrashStreak", .beacon_file_exists = true, .beacon_file_contents = - "{\"user_experience_metrics.stability.exited_cleanly\": true}"}, + "{\"user_experience_metrics.stability.exited_cleanly\": true}", + .beacon_file_state = BeaconFileState::kMissingCrashStreak}, BadBeaconTestParams{ .test_name = "MissingBeacon", .beacon_file_exists = true, - .beacon_file_contents = "{\"variations_crash_streak\": 1}"}), + .beacon_file_contents = "{\"variations_crash_streak\": 1}", + .beacon_file_state = BeaconFileState::kMissingBeacon}), [](const ::testing::TestParamInfo& params) { return params.param.test_name; }); // Verify that the inability to get the beacon file's contents for a plethora of -// reasons (a) doesn't crash and (b) correctly records the -// GotVariationsFileContents metric. +// reasons (a) doesn't crash and (b) correctly records the BeaconFileState +// metric. TEST_P(BadBeaconFileTest, InitWithUnusableBeaconFile) { SetUpExtendedSafeModeExperiment(variations::kSignalAndWriteViaFileUtilGroup); BadBeaconTestParams params = GetParam(); @@ -266,7 +277,8 @@ TEST_P(BadBeaconFileTest, InitWithUnusableBeaconFile) { TestCleanExitBeacon beacon(&prefs_, user_data_dir_path); histogram_tester_.ExpectUniqueSample( - "Variations.ExtendedSafeMode.GotVariationsFileContents", false, 1); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", + params.beacon_file_state, 1); } // TODO(crbug/1248239): Enable these tests on Android when the Extended @@ -289,7 +301,8 @@ TEST_F(CleanExitBeaconTest, InitWithBeaconFile) { TestCleanExitBeacon clean_exit_beacon(&prefs_, user_data_dir_path); histogram_tester_.ExpectUniqueSample( - "Variations.ExtendedSafeMode.GotVariationsFileContents", true, 1); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", + BeaconFileState::kReadable, 1); EXPECT_TRUE(clean_exit_beacon.exited_cleanly()); histogram_tester_.ExpectUniqueSample("Variations.SafeMode.Streak.Crashes", num_crashes, 1); @@ -313,7 +326,8 @@ TEST_F(CleanExitBeaconTest, InitWithCrashAndBeaconFile) { const int updated_num_crashes = last_session_num_crashes + 1; TestCleanExitBeacon clean_exit_beacon(&prefs_, user_data_dir_path); histogram_tester_.ExpectUniqueSample( - "Variations.ExtendedSafeMode.GotVariationsFileContents", true, 1); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", + BeaconFileState::kReadable, 1); EXPECT_FALSE(clean_exit_beacon.exited_cleanly()); histogram_tester_.ExpectUniqueSample("Variations.SafeMode.Streak.Crashes", updated_num_crashes, 1); diff --git a/components/optimization_guide/core/hints_manager.cc b/components/optimization_guide/core/hints_manager.cc index 394d4c18e13bfe..800f42431b3b2d 100644 --- a/components/optimization_guide/core/hints_manager.cc +++ b/components/optimization_guide/core/hints_manager.cc @@ -302,6 +302,7 @@ HintsManager::HintsManager( hint_cache_( std::make_unique(hint_store, features::MaxHostKeyedHintCacheSize())), + batch_update_hints_fetchers_(features::MaxConcurrentBatchUpdateFetches()), page_navigation_hints_fetchers_( features::MaxConcurrentPageNavigationFetches()), hints_fetcher_factory_(std::make_unique( @@ -671,11 +672,6 @@ void HintsManager::FetchHintsForActiveTabs() { if (top_hosts.empty() && active_tab_urls_to_refresh.empty()) return; - if (!batch_update_hints_fetcher_) { - DCHECK(hints_fetcher_factory_); - batch_update_hints_fetcher_ = hints_fetcher_factory_->BuildInstance(); - } - // Add hosts of active tabs to list of hosts to fetch for. Since we are mainly // fetching for updated information on tabs, add those to the front of the // list. @@ -695,7 +691,12 @@ void HintsManager::FetchHintsForActiveTabs() { registered_optimization_types_, active_tab_urls_to_refresh, top_hosts); - batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( + if (!active_tabs_batch_update_hints_fetcher_) { + DCHECK(hints_fetcher_factory_); + active_tabs_batch_update_hints_fetcher_ = + hints_fetcher_factory_->BuildInstance(); + } + active_tabs_batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( top_hosts, active_tab_urls_to_refresh, registered_optimization_types_, proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, application_locale_, base::BindOnce(&HintsManager::OnHintsForActiveTabsFetched, @@ -729,9 +730,12 @@ void HintsManager::OnPageNavigationHintsFetched( const base::flat_set& page_navigation_hosts_requested, absl::optional> get_hints_response) { + if (navigation_url) { + CleanUpFetcherForNavigation(*navigation_url); + } + if (!get_hints_response.has_value() || !get_hints_response.value()) { if (navigation_url) { - CleanUpFetcherForNavigation(*navigation_url); PrepareToInvokeRegisteredCallbacks(*navigation_url); } return; @@ -776,7 +780,6 @@ void HintsManager::OnFetchedPageNavigationHintsStored( navigation_data_weak_ptr.MaybeValid()); if (navigation_url) { - CleanUpFetcherForNavigation(*navigation_url); PrepareToInvokeRegisteredCallbacks(*navigation_url); } } @@ -809,7 +812,7 @@ void HintsManager::LoadHintForURL(const GURL& url, base::OnceClosure callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!url.has_host()) { - std::move(callback).Run(); + MaybeRunUpdateClosure(std::move(callback)); return; } @@ -825,34 +828,44 @@ void HintsManager::LoadHintForHost(const std::string& host, std::move(callback))); } -void HintsManager::FetchHintsForURLs(std::vector target_urls, +void HintsManager::FetchHintsForURLs(const std::vector& urls, proto::RequestContext request_context) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Collect hosts, stripping duplicates, but preserving the ordering. + InsertionOrderedSet target_urls; InsertionOrderedSet target_hosts; - for (const auto& url : target_urls) { + for (const auto& url : urls) { target_hosts.insert(url.host()); + target_urls.insert(url); } if (target_hosts.empty() && target_urls.empty()) return; - if (!batch_update_hints_fetcher_) { - DCHECK(hints_fetcher_factory_); - batch_update_hints_fetcher_ = hints_fetcher_factory_->BuildInstance(); - } + MaybeLogGetHintRequestInfo(request_context, registered_optimization_types_, + target_urls.vector(), target_hosts.vector()); + + std::pair request_id_and_fetcher = + CreateAndTrackBatchUpdateHintsFetcher(); // Use the batch update hints fetcher for fetches off the SRP since we are - // not fetching for the current navigation, even though we are fetching using - // the page navigation context. However, since we do want to load the hints - // returned, we pass this through to the page navigation callback. - batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( - target_hosts.vector(), target_urls, registered_optimization_types_, - request_context, application_locale_, - base::BindOnce(&HintsManager::OnPageNavigationHintsFetched, - weak_ptr_factory_.GetWeakPtr(), nullptr, absl::nullopt, - target_urls, target_hosts.set())); + // not fetching for the current navigation. + // + // Caller does not expect to be notified when relevant hints have been fetched + // and stored. + request_id_and_fetcher.second->FetchOptimizationGuideServiceHints( + target_hosts.vector(), target_urls.vector(), + registered_optimization_types_, request_context, application_locale_, + base::BindOnce( + &HintsManager::OnBatchUpdateHintsFetched, + weak_ptr_factory_.GetWeakPtr(), request_id_and_fetcher.first, + request_context, target_hosts.set(), target_urls.set(), + registered_optimization_types_, + base::DoNothingAs&)>())); } void HintsManager::OnHintLoaded(base::OnceClosure callback, @@ -864,7 +877,7 @@ void HintsManager::OnHintLoaded(base::OnceClosure callback, // Run the callback now that the hint is loaded. This is used as a signal by // tests. - std::move(callback).Run(); + MaybeRunUpdateClosure(std::move(callback)); } void HintsManager::RegisterOptimizationTypes( @@ -1015,46 +1028,51 @@ void HintsManager::CanApplyOptimizationOnDemand( urls_to_fetch.vector(), hosts_to_fetch.vector()); // Fetch the data for the entries we don't have all information for. - if (!batch_update_hints_fetcher_) { - DCHECK(hints_fetcher_factory_); - batch_update_hints_fetcher_ = hints_fetcher_factory_->BuildInstance(); - } - batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( + std::pair request_id_and_fetcher = + CreateAndTrackBatchUpdateHintsFetcher(); + request_id_and_fetcher.second->FetchOptimizationGuideServiceHints( hosts_to_fetch.vector(), urls_to_fetch.vector(), registered_optimization_types_, request_context, application_locale_, - base::BindOnce(&HintsManager::OnOnDemandHintsFetched, - weak_ptr_factory_.GetWeakPtr(), hosts_to_fetch.set(), - urls_to_fetch.set(), optimization_types, callback)); + base::BindOnce(&HintsManager::OnBatchUpdateHintsFetched, + weak_ptr_factory_.GetWeakPtr(), + request_id_and_fetcher.first, request_context, + hosts_to_fetch.set(), urls_to_fetch.set(), + optimization_types, callback)); } -void HintsManager::OnOnDemandHintsFetched( +void HintsManager::OnBatchUpdateHintsFetched( + int32_t request_id, + proto::RequestContext request_context, const base::flat_set& hosts_requested, const base::flat_set& urls_requested, const base::flat_set& optimization_types, OnDemandOptimizationGuideDecisionRepeatingCallback callback, absl::optional> get_hints_response) { + CleanUpBatchUpdateHintsFetcher(request_id); + if (!get_hints_response.has_value() || !get_hints_response.value()) { - OnReadyToInvokeOnDemandHintsCallbackForURLs(urls_requested, - optimization_types, callback); + OnBatchUpdateHintsStored(urls_requested, optimization_types, callback); return; } - // TODO(crbug/1278015: Figure out if the update time duration is the right + // TODO(crbug/1278015): Figure out if the update time duration is the right // one. hint_cache_->UpdateFetchedHints( std::move(*get_hints_response), clock_->Now() + features::GetActiveTabsFetchRefreshDuration(), hosts_requested, urls_requested, - base::BindOnce(&HintsManager::OnReadyToInvokeOnDemandHintsCallbackForURLs, + base::BindOnce(&HintsManager::OnBatchUpdateHintsStored, weak_ptr_factory_.GetWeakPtr(), urls_requested, optimization_types, callback)); - if (switches::IsDebugLogsEnabled()) - DVLOG(0) << "OptimizationGuide: OnOnDemandHintsFetched complete"; + if (switches::IsDebugLogsEnabled()) { + DVLOG(0) << "OptimizationGuide: OnBatchUpdateHintsFetched for " + << proto::RequestContext_Name(request_context) << " complete"; + } } -void HintsManager::OnReadyToInvokeOnDemandHintsCallbackForURLs( +void HintsManager::OnBatchUpdateHintsStored( const base::flat_set& urls, const base::flat_set& optimization_types, OnDemandOptimizationGuideDecisionRepeatingCallback callback) { @@ -1071,6 +1089,27 @@ void HintsManager::OnReadyToInvokeOnDemandHintsCallbackForURLs( } } +std::pair +HintsManager::CreateAndTrackBatchUpdateHintsFetcher() { + DCHECK(hints_fetcher_factory_); + std::unique_ptr hints_fetcher = + hints_fetcher_factory_->BuildInstance(); + HintsFetcher* hints_fetcher_ptr = hints_fetcher.get(); + batch_update_hints_fetchers_.Put(batch_update_hints_fetcher_request_id_++, + std::move(hints_fetcher)); + UMA_HISTOGRAM_COUNTS_100( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", + batch_update_hints_fetchers_.size()); + return std::make_pair(batch_update_hints_fetcher_request_id_, + hints_fetcher_ptr); +} + +void HintsManager::CleanUpBatchUpdateHintsFetcher(int32_t request_id) { + auto it = batch_update_hints_fetchers_.Peek(request_id); + if (it != batch_update_hints_fetchers_.end()) + batch_update_hints_fetchers_.Erase(it); +} + void HintsManager::InvokeOnDemandHintsCallbackForURL( const GURL& url, const base::flat_set& optimization_types, diff --git a/components/optimization_guide/core/hints_manager.h b/components/optimization_guide/core/hints_manager.h index 549652e7c5e385..94aaa3d71cea80 100644 --- a/components/optimization_guide/core/hints_manager.h +++ b/components/optimization_guide/core/hints_manager.h @@ -134,11 +134,6 @@ class HintsManager : public OptimizationHintsComponentObserver, // and in memory ones. void ClearHostKeyedHints(); - // Returns the current batch update hints fetcher. - HintsFetcher* batch_update_hints_fetcher() const { - return batch_update_hints_fetcher_.get(); - } - // Overrides |hints_fetcher_factory| for testing. void SetHintsFetcherFactoryForTesting( std::unique_ptr hints_fetcher_factory); @@ -164,7 +159,7 @@ class HintsManager : public OptimizationHintsComponentObserver, void OnDeferredStartup(); // Fetch the hints for the given URLs with the provided |request_context|. - void FetchHintsForURLs(std::vector target_urls, + void FetchHintsForURLs(const std::vector& target_urls, proto::RequestContext request_context); // PushNotificationManager::Delegate: @@ -194,6 +189,7 @@ class HintsManager : public OptimizationHintsComponentObserver, private: friend class ::OptimizationGuideTestAppInterfaceWrapper; + friend class HintsManagerTest; // Processes the optimization filters contained in the hints component. void ProcessOptimizationFilters( @@ -249,10 +245,12 @@ class HintsManager : public OptimizationHintsComponentObserver, absl::optional> get_hints_response); - // Called when the on demand hints have been fetched from the remote + // Called when the batch update hints have been fetched from the remote // Optimization Guide Service and are ready for parsing. This is used when - // fetching hints on demand. - void OnOnDemandHintsFetched( + // fetching hints on demand or from SRP. + void OnBatchUpdateHintsFetched( + int32_t request_id, + proto::RequestContext request_context, const base::flat_set& hosts_fetched, const base::flat_set& urls_fetched, const base::flat_set& optimization_types, @@ -260,13 +258,26 @@ class HintsManager : public OptimizationHintsComponentObserver, absl::optional> get_hints_response); - // Called when information is ready such that we can invoke the on-demand - // hints callback. - void OnReadyToInvokeOnDemandHintsCallbackForURLs( + // Called when information is ready such that we can invoke any callbacks that + // require returning decisions to consumer features. + // + // TODO(crbug/1279536): Clean this up when we clean up some of the existing + // interfaces. + void OnBatchUpdateHintsStored( const base::flat_set& urls_fetched, const base::flat_set& optimization_types, OnDemandOptimizationGuideDecisionRepeatingCallback callback); + // Creates a hints fetcher and stores it in |batch_update_hints_fetchers_| and + // returns the request ID associated with the fetch. It is expected to call + // `CleanUpBatchUpdateHintsFetcher` with the returned request ID once the + // fetch has finished. + std::pair CreateAndTrackBatchUpdateHintsFetcher(); + + // Called to inform |this| that the batch fetcher with |request_id| is no + // longer needed removes the request from |batch_update_hints_fetchers_| + void CleanUpBatchUpdateHintsFetcher(int32_t request_id); + // Returns decisions for |url| and |optimization_types| based on what's cached // locally. base::flat_map @@ -366,6 +377,20 @@ class HintsManager : public OptimizationHintsComponentObserver, HintsFetcherFactory* GetHintsFetcherFactory(); + // Returns the number of batch update hints fetches initiated. + // + // Exposed here for testing. + int32_t num_batch_update_hints_fetches_initiated() const { + return batch_update_hints_fetcher_request_id_; + } + + // Returns the current active tabs batch update hints fetcher. + // + // Exposed here for testing. + HintsFetcher* active_tabs_batch_update_hints_fetcher() const { + return active_tabs_batch_update_hints_fetcher_.get(); + } + // The information of the latest component delivered by // |optimization_guide_service_|. absl::optional hints_component_info_; @@ -412,9 +437,15 @@ class HintsManager : public OptimizationHintsComponentObserver, // fetched from the remote Optimization Guide Service. std::unique_ptr hint_cache_; - // The fetcher that handles making requests for hints for multiple hosts from + // The fetcher that handles making requests for hints for active tabs from // the remote Optimization Guide Service. - std::unique_ptr batch_update_hints_fetcher_; + std::unique_ptr active_tabs_batch_update_hints_fetcher_; + + // A map from request ID to the fetcher that handles making requests for hints + // for multiple hosts from the remote Optimization Guide Service. + base::LRUCache> + batch_update_hints_fetchers_; + int32_t batch_update_hints_fetcher_request_id_ = 0; // A cache keyed by navigation URL to the fetcher making a request for a hint // for that URL and/or host to the remote Optimization Guide Service that diff --git a/components/optimization_guide/core/hints_manager_unittest.cc b/components/optimization_guide/core/hints_manager_unittest.cc index c40566095b993e..8dd0d403295a74 100644 --- a/components/optimization_guide/core/hints_manager_unittest.cc +++ b/components/optimization_guide/core/hints_manager_unittest.cc @@ -453,9 +453,13 @@ class HintsManagerTest : public ProtoDatabaseProviderTestBase { HintsManager* hints_manager() const { return hints_manager_.get(); } - TestHintsFetcher* batch_update_hints_fetcher() const { + int32_t num_batch_update_hints_fetches_initiated() const { + return hints_manager()->num_batch_update_hints_fetches_initiated(); + } + + TestHintsFetcher* active_tabs_batch_update_hints_fetcher() const { return static_cast( - hints_manager()->batch_update_hints_fetcher()); + hints_manager()->active_tabs_batch_update_hints_fetcher()); } GURL url_with_hints() const { @@ -1565,7 +1569,7 @@ TEST_F(HintsManagerFetchingDisabledTest, MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); EXPECT_EQ(0, top_host_provider->get_num_top_hosts_called()); // Hints fetcher should not even be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerTest, @@ -1794,7 +1798,8 @@ class HintsManagerFetchingTest : public HintsManagerTest { { { features::kRemoteOptimizationGuideFetching, - {{"max_concurrent_page_navigation_fetches", "2"}}, + {{"max_concurrent_page_navigation_fetches", "2"}, + {"max_concurrent_batch_update_fetches", "2"}}, }, }, {features::kRemoteOptimizationGuideFetchingAnonymousDataConsent}); @@ -1820,7 +1825,7 @@ TEST_F(HintsManagerFetchingTest, // Force timer to expire and schedule a hints fetch. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); // Hints fetcher should not even be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, @@ -1841,8 +1846,8 @@ TEST_F(HintsManagerFetchingTest, // Force timer to expire and schedule a hints fetch but the fetch is not made. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); EXPECT_EQ(0, top_host_provider->get_num_top_hosts_called()); - // Hints fetcher should not be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, @@ -1873,8 +1878,8 @@ TEST_F(HintsManagerFetchingTest, // Force timer to expire after random delay and schedule a hints fetch. MoveClockForwardBy(base::Seconds(60 * 2)); EXPECT_EQ(0, top_host_provider->get_num_top_hosts_called()); - // Hints fetcher should not be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsOrUrlsToFetch) { @@ -1901,15 +1906,15 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsOrUrlsToFetch) { MoveClockForwardBy(base::Seconds(60 * 2)); EXPECT_EQ(1, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - // Hints fetcher should not be even created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); // Move it forward again to make sure timer is scheduled. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); EXPECT_EQ(2, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); - // Still no hosts or URLs, so hints fetcher should still not be even created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsButHasUrlsToFetch) { @@ -1940,10 +1945,13 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsButHasUrlsToFetch) { MoveClockForwardBy(base::Seconds(60 * 2)); EXPECT_EQ(1, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); - EXPECT_EQ("en-US", batch_update_hints_fetcher()->locale_requested()); - EXPECT_EQ(proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, - batch_update_hints_fetcher()->request_context_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ("en-US", + active_tabs_batch_update_hints_fetcher()->locale_requested()); + EXPECT_EQ( + proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, + active_tabs_batch_update_hints_fetcher()->request_context_requested()); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); @@ -1952,7 +1960,8 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsButHasUrlsToFetch) { EXPECT_EQ(2, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); // Urls didn't change and we have all URLs cached in store. - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0, 1); } @@ -1982,7 +1991,7 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherTimerFetchOnStartup) { RunUntilIdle(); histogram_tester.ExpectTotalCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0); - EXPECT_EQ(nullptr, batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); EXPECT_EQ(0, tab_url_provider()->get_num_urls_called()); // Force timer to expire after random delay and schedule a hints fetch that @@ -1991,14 +2000,16 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherTimerFetchOnStartup) { histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); // Move it forward again to make sure timer is scheduled. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0, 1); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); } // Verifies the deferred startup mode that fetches hints for active tab URLs on @@ -2035,14 +2046,16 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherDeferredStartup) { histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); // Move it forward again to make sure timer is scheduled. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0, 1); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); } TEST_F(HintsManagerFetchingTest, @@ -3172,6 +3185,54 @@ TEST_F(HintsManagerFetchingTest, }, run_loop.get())); run_loop->Run(); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 1, 1); +} + +TEST_F(HintsManagerFetchingTest, BatchUpdateCalledMoreThanMaxConcurrent) { + base::HistogramTester histogram_tester; + + hints_manager()->RegisterOptimizationTypes({proto::COMPRESS_PUBLIC_IMAGES}); + InitializeWithDefaultConfig("1.0.0.0"); + + // Set to online so fetch is activated. + SetConnectionOnline(); + + hints_manager()->SetHintsFetcherFactoryForTesting( + BuildTestHintsFetcherFactory( + {HintsFetcherEndState::kFetchSuccessWithURLHints})); + + // Call this over the max count. + hints_manager()->CanApplyOptimizationOnDemand( + {url_with_url_keyed_hint()}, {proto::COMPRESS_PUBLIC_IMAGES}, + proto::RequestContext::CONTEXT_BOOKMARKS, + base::DoNothingAs&)>()); + hints_manager()->CanApplyOptimizationOnDemand( + {url_with_url_keyed_hint()}, {proto::COMPRESS_PUBLIC_IMAGES}, + proto::RequestContext::CONTEXT_BOOKMARKS, + base::DoNothingAs&)>()); + hints_manager()->CanApplyOptimizationOnDemand( + {url_with_url_keyed_hint()}, {proto::COMPRESS_PUBLIC_IMAGES}, + proto::RequestContext::CONTEXT_BOOKMARKS, + base::DoNothingAs&)>()); + + // The third one is over the max and should evict another one. + histogram_tester.ExpectTotalCount( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 3); + histogram_tester.ExpectBucketCount( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 1, 1); + histogram_tester.ExpectBucketCount( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 2, 2); } TEST_F( @@ -3286,7 +3347,7 @@ TEST_F(HintsManagerFetchingNoBatchUpdateTest, // Force timer to expire and schedule a hints fetch. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); // Hints fetcher should not even be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } } // namespace optimization_guide diff --git a/components/optimization_guide/core/optimization_guide_features.cc b/components/optimization_guide/core/optimization_guide_features.cc index 354fc064776929..cff2fd08e8b478 100644 --- a/components/optimization_guide/core/optimization_guide_features.cc +++ b/components/optimization_guide/core/optimization_guide_features.cc @@ -233,6 +233,15 @@ base::TimeDelta GetActiveTabsStalenessTolerance() { "active_tabs_staleness_tolerance_in_days", 90)); } +size_t MaxConcurrentBatchUpdateFetches() { + // If overridden, this needs to be large enough where we do not thrash the + // inflight batch update fetches since if we approach the limit here, we will + // abort the oldest batch update fetch that is in flight. + return GetFieldTrialParamByFeatureAsInt(kRemoteOptimizationGuideFetching, + "max_concurrent_batch_update_fetches", + 20); +} + size_t MaxConcurrentPageNavigationFetches() { // If overridden, this needs to be large enough where we do not thrash the // inflight page navigations since if we approach the limit here, we will diff --git a/components/optimization_guide/core/optimization_guide_features.h b/components/optimization_guide/core/optimization_guide_features.h index 79da969ed9bf66..1596ac11e88795 100644 --- a/components/optimization_guide/core/optimization_guide_features.h +++ b/components/optimization_guide/core/optimization_guide_features.h @@ -107,7 +107,11 @@ base::TimeDelta GetActiveTabsFetchRefreshDuration(); base::TimeDelta GetActiveTabsStalenessTolerance(); // Returns the max number of concurrent fetches to the remote Optimization Guide -// Service that should be allowed. +// Service that should be allowed for batch updates +size_t MaxConcurrentBatchUpdateFetches(); + +// Returns the max number of concurrent fetches to the remote Optimization Guide +// Service that should be allowed for navigations. size_t MaxConcurrentPageNavigationFetches(); // Returns the minimum number of seconds to randomly delay before starting to diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 44b76df2fcb63f..ae8c452bb92fca 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb @@ -178,6 +178,7 @@ Genaue Informationen zu gültigen -Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. ist kein akzeptierter Wert für diese Richtlinie. Informationen zum Lüfter melden +Laden von Lazy Login WebUI deaktivieren. Unterstützung für Signed HTTP Exchange (SXG) aktivieren Gibt an, ob das Gerät auf die von festgelegte Version zurückgesetzt werden soll, obwohl bereits eine neuere Version ausgeführt wird. @@ -484,6 +485,23 @@ Wenn Sie diese Richtlinie deaktivieren, wird das Scrollen zu bestimmten Textfrag Wenn für diese Richtlinie "True" festgelegt ist, maximiert Chrome beim ersten Start das erste angezeigte Fenster. Ist sie auf "False" gesetzt oder nicht konfiguriert, kann das erste Fenster von Chrome maximiert werden. Das richtet sich nach der Displaygröße. +Diese Richtlinie erlaubt standardmäßig das an Ursprünge gebundene Agent-Clustering. + + Der HTTP-Header „Origin-Agent-Cluster“ legt fest, ob ein Dokument + in einem an Ursprünge gebundenen Agent-Cluster oder einem an Websites gebundenen Agent-Cluster + isoliert wird. Dies hat Auswirkungen auf die Sicherheit, da an Ursprünge gebundene Agent-Cluster + die Isolation von Dokumenten nach dem Ursprung erlauben. Die Folge für Entwickler ist, + dass die Zugriffsfunktion „document.domain“ nicht mehr + festgelegt werden kann. + + Das Standardverhalten – wenn der Header „Origin-Agent-Cluster“ nicht konfiguriert ist – + ändert sich in M101 von „an Websites gebunden“ zu „an Ursprünge gebunden“. Wenn diese Richtlinie + aktiviert oder nicht konfiguriert ist, folgt der Browser ab dieser Version + dem neuen Standardverhalten. Wenn diese Richtlinie deaktiviert ist, wird die Änderung rückgängig gemacht und + Dokumente ohne den Header „Origin-Agent-Cluster“ werden + an Websites gebundene Agent-Clustern zugewiesen. Die Zugriffsfunktion „document.domain“ + lässt sich dann standardmäßig konfigurieren. Dies entspricht dem Verhalten älterer Versionen. + Wenn die Richtlinie deaktiviert ist, deaktiviert das WLAN und Nutzer können dies nicht ändern. Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, können Nutzer das WLAN aktivieren und deaktivieren. @@ -633,6 +651,7 @@ Das Feld „“ wurde zuguns Siehe auch . Hinweis: Sofern vorhanden, wird mit dieser Einstellung überschrieben. +Login WebUI nur bei Bedarf laden. Speichern von lokalen Daten für alle Websites zulassen Wenn die Richtlinie konfiguriert ist, wird die Bildschirmhelligkeit in % festgelegt und Funktionen zur automatischen Anpassung der Bildschirmhelligkeit werden deaktiviert. Die Bildschirmhelligkeit wird anfangs an den Richtlinienwert angepasst, aber der Nutzer kann sie später ändern. @@ -716,6 +735,7 @@ Das Feld „“ wurde zuguns Diese Richtlinie ist optional. Wenn sie nicht festlegt ist, wird die Anfrage für die Suche im Voraus mithilfe der GET-Methode gesendet. Diese Richtlinie wird nur berücksichtigt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist. +Standardmäßig werden Dokumente zu an Websites gebundene Agent-Cluster hinzugefügt – die Zugriffsfunktion „document.domain“ kann weiterhin konfiguriert werden. Autoplay von Medien erlauben Achtung: Der TLS-Versions-Fallback wird nach Version 52 (ungefähr im September 2016) aus entfernt. Diese Richtlinie funktioniert dann nicht mehr. @@ -1848,6 +1868,15 @@ Ist sie nicht konfiguriert, ist der Datenschutzbildschirm anfangs deaktiviert, N Unified Desktop verfügbar machen und standardmäßig aktivieren Nutzer darf Crostini-Container über die Benutzeroberfläche exportieren/importieren Im PostScript-Modus drucken +Mit dieser Richtlinie wird festgelegt, ob der WebUI-Abschnitt des Anmeldebildschirms immer beim Start geladen wird oder erst kurz bevor er eingeblendet wird. Diese Richtlinie gilt für den Anmeldebildschirm. + + Wenn die Richtlinie aktiviert ist, wird der WebUI-Abschnitt des Anmeldebildschirms erst kurz vor dem Einblenden geladen. Dadurch lässt sich der Anmeldevorgang beschleunigen. + + Wenn die Richtlinie deaktiviert ist, wird der WebUI-Abschnitt des Anmeldebildschirms immer beim Start geladen (altes Standardverhalten). + + Ist die Richtlinie nicht konfiguriert, wird das Verhalten von der Funktion „kEnableLazyLoginWebUILoading“ gesteuert. + + Diese Richtlinie sollte entfernt werden, nachdem „kEnableLazyLoginWebUILoading“ vollständig eingeführt ist. Diese Richtlinien sind hier verfügbar, damit sie einfach entfernt werden können. Zulassen, dass Nutzer Android-Apps aus nicht vertrauenswürdigen Quellen verwenden Diese Einstellung wird ab -Version 29 nicht mehr verwendet. Zur Einrichtung einer Sammlung mit Erweiterungen oder Apps, die von der Organisation gehostet wird, empfehlen wir, die Host-Website der CRX-Pakete in "ExtensionInstallSources" einzufügen und auf einer Webseite direkte Downloadlinks zu den Paketen bereitzustellen. Ein Launcher für diese Webseite kann mithilfe der Richtlinie "ExtensionInstallForcelist" erstellt werden. @@ -3985,6 +4014,7 @@ Wenn die Richtlinie auf "True" gesetzt oder nicht konfiguriert ist, können Nutz Ist sie auf "False" gesetzt oder nicht konfiguriert, sind die Funktionen von Web Components v0 ab M80 standardmäßig deaktiviert. Diese Richtlinie wird nach Chrome 84 entfernt. +Standardmäßig werden Dokumente zu an Ursprüngen gebundene Agent-Cluster hinzugefügt – die Funktion „document.domain“ kann für solche Dokumente nicht konfiguriert werden. VPD-Informationen zu einem Gerät melden. Wenn die Richtlinie auf "false" gesetzt oder nicht konfiguriert ist, werden keine Informationen ausgegeben. @@ -4762,6 +4792,7 @@ Wenn der Wert für bei keinem Eintr Geben Sie einen -Hash an, indem Sie Folgendes verketten: den Hash-Algorithmusnamen, das Zeichen "/" sowie die Base64-Codierung dieses Hash-Algorithmus, die auf das DER-codierte des angegebenen Zertifikats angewendet wird. Die Base64-Codierung hat dasselbe Format wie ein SPKI-Fingerabdruck. Der einzige erkannte Hash-Algorithmus ist "sha256". Alle anderen werden ignoriert. Wenn die Richtlinie nicht konfiguriert ist, werden alle Zertifikate, für die eine Certificate Transparency-Offenlegung erforderlich ist und die nicht offengelegt werden, von als nicht vertrauenswürdig behandelt. +Laden von Lazy Login WebUI aktivieren. Diese Richtlinie ist veraltet und wurde durch "AdvancedProtectionAllowed" ersetzt. Mit dieser Richtlinie wird festgelegt, ob Nutzer, die am erweiterten Sicherheitsprogramm teilnehmen, ihre heruntergeladenen Dateien für einen Malware-Scan an Google senden können. Wird die Richtlinie auf "true" gesetzt oder nicht konfiguriert, werden Nutzer dazu aufgefordert, ihre heruntergeladenen Dateien für einen Tiefenscan an Google zu senden. Wenn der Nutzer die Option zum Scannen auswählt, wird der Download an Google gesendet. Wird diese Richtlinie auf "false" gesetzt, werden Nutzer nicht dazu aufgefordert, ihre heruntergeladenen Dateien an Google zu senden. @@ -6495,6 +6526,11 @@ Ist die Richtlinie auf "false" gesetzt oder nicht konfiguriert, kann der Nutzer Unter steht diese Funktion nur bei Instanzen zur Verfügung, die Teil einer -Domain sind, auf denen Windows 10 Pro läuft oder die über verwaltet werden. Unter steht diese Funktion nur bei Instanzen zur Verfügung, die über die Mobilgeräteverwaltung verwaltet werden oder per MCX mit einer Domain verbunden sind. Desktop-Freigabe-Hub aktivieren +Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, darf die zusätzliche Risikominderung für Erweiterungspunkte anwenden, um alte Erweiterungspunkte im Browserprozess zu blockieren. + + Wird die Richtlinie deaktiviert, hat dies negative Auswirkungen auf die Sicherheit und Stabilität von , da dann unbekannter und potenziell schädlicher Code in den Browserprozess von geladen werden kann. Die Richtlinie sollte nur deaktiviert werden, wenn Kompatibilitätsprobleme mit Drittanbieter-Software auftreten, die innerhalb des Browserprozesses von ausgeführt werden muss. + + Hinweis: Weitere Informationen zu Prozessschutzrichtlinien finden Sie unter https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies. Automatische Aktualisierung auf Zielversion U2F (Universal Second Factor) Wenn diese Richtlinie aktiviert ist, vergleicht der Host für den Remotezugriff den Namen des mit dem Host verknüpften lokalen Nutzers mit dem Namen des Google-Kontos, das als Hosteigentümer registriert ist (z. B. „maxmustermann“, wenn der Hosteigentümer das Google-Konto „maxmustermann@beispiel.de“ ist). Dieser Host wird nicht gestartet, wenn der Name des Hosteigentümers vom Namen des mit dem Host verknüpften lokalen Nutzers abweicht. Wenn Sie erzwingen möchten, dass das Google-Konto des Eigentümers mit einer bestimmten Domain verknüpft ist, verwenden Sie die Richtlinie mit . @@ -6765,6 +6801,7 @@ Ist die Richtlinie auf "false" gesetzt oder nicht konfiguriert, kann der Nutzer Zulassungsliste für Authentifizierungsserver Datenträger-Cache-Verzeichnis festlegen Zurück nach oben +Diese Richtlinie erlaubt standardmäßig das an Ursprünge gebundene Agent-Clustering. Standardkonfiguration Chrome-Apps wurden für Windows, Mac und Linux eingestellt. Wenn diese Richtlinie aktiviert wird, erlaubt es, dass Chrome-Apps bis zu dem Datum im Juni 2022, an dem die Unterstützung für Chrome-Apps auf allen Plattformen beendet wird, auf diesen Plattformen ausgeführt werden. diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 6438c50e75038d..f648a05bd03213 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb @@ -178,6 +178,7 @@ Para obtener información detallada sobre los patrones de válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. no es un valor aceptado para esta política. Envía información de los ventiladores +Inhabilitar la carga diferida de la WebUI de acceso Habilitar compatibilidad con intercambios HTTP firmados (SXG) Especifica si el dispositivo debe volver a la versión que se establece en , si ya ejecuta una versión más reciente. @@ -486,6 +487,23 @@ Si la inhabilitas, se inhabilitará el desplazamiento de la página web a fragme Si estableces la política como verdadera, Chrome maximizará la primera ventana que se muestre en la primera ejecución. Si la estableces como falsa o no la estableces, Chrome maximizará la primera ventana siempre que el tamaño de la pantalla lo permita. +Esta política permite el agrupamiento en clústeres de agentes con clave de origen de forma predeterminada. + + El encabezado del HTTP Origin-Agent-Cluster controla si un documento está + aislado en un clúster de agentes con clave de origen o bien en un + clúster con clave de sitio. Esto tiene repercusiones en la seguridad ya que un + clúster de agentes con clave de origen permite el aislamiento de documentos por origen. La consecuencia + visible de esto para el desarrollador es que el descriptor de acceso de document.domain ya no podrá + establecerse. + + El comportamiento predeterminado cuando no se establece un encabezado Origin-Agent-Cluster + cambia en M101 de clave de sitio a clave de origen. Si habilitas + o no estableces la política, el navegador seguirá la nueva configuración predeterminada + de esa versión en adelante. Si la inhabilitas, se revierte este cambio y + los documentos que no contengan encabezados Origin-Agent-Cluster se asignarán a + los clústeres de agentes con clave de sitio. Como consecuencia, el descriptor de acceso de document.domain + podrá establecerse de forma predeterminada. Esto coincide con el comportamiento heredado. + Si inhabilitas la política, desactivará la conexión Wi-Fi y los usuarios no podrán cambiar esta acción. Si la habilitas o no la estableces, los usuarios podrán activar o desactivar la conexión Wi-Fi. @@ -635,6 +653,7 @@ Si la inhabilitas, se inhabilitará el desplazamiento de la página web a fragme Consulta también . Nota: Esta configuración anulará , si se aplica. +Cargar la WebUI de acceso solo cuando sea necesario Permitir a todos los sitios establecer datos locales Si estableces la política, se especificará el porcentaje de brillo de la pantalla y se desactivarán las funciones de brillo automático. Se ajustará el brillo inicial de la pantalla conforme al valor de la política, pero los usuarios podrán cambiar este valor. @@ -718,6 +737,7 @@ Si la inhabilitas, se inhabilitará el desplazamiento de la página web a fragme Esta política es opcional. Si no se establece, la solicitud de búsqueda instantánea se enviará mediante el método GET. Esta política solo se respeta si se habilita la política "DefaultSearchProviderEnabled". +De forma predeterminada, los documentos se ubican en clústeres de agentes con clave de sitio. document.domain aún puede establecerse. Permitir la reproducción automática de contenido multimedia Advertencia: El resguardo de la versión de TLS se quitará de después de la versión 52 (alrededor de septiembre de 2016), y esta política dejará de funcionar. @@ -1864,6 +1884,15 @@ Si no la estableces, inicialmente se inhabilitará la pantalla de privacidad, pe Habilitar el modo de escritorio unificado y activarlo de forma predeterminada El usuario está habilitado para exportar o importar contenedores de Crostini mediante la IU Imprimir con el modo PostScript +Esta política controla si la parte WebUI de la pantalla de acceso cargará al inicio o solo antes de que se muestre. Esta política se aplica a la pantalla de acceso. + + Si la habilitas, la parte WebUI de la IU de acceso cargará solo antes de que se muestre. Esto acelera el acceso. + + Si la inhabilitas, la parte WebUI de la pantalla de acceso siempre cargará al inicio (comportamiento heredado). + + Si no la estableces, la función kEnableLazyLoginWebUILoading controlará el comportamiento. + + Se debe quitar esta política después del lanzamiento completo de kEnableLazyLoginWebUILoading. Se incluyen estas políticas aquí para que sea más fácil quitarlas. Permite que el usuario utilice apps para Android de fuentes no confiables Esta opción se eliminó a partir de la versión 29 de . La forma recomendada de configurar colecciones de aplicaciones o extensiones alojadas por una organización es incluir el sitio que aloja los paquetes CRX en la política ExtensionInstallSources y colocar vínculos de descarga directa a los paquetes en una página web. Se puede crear un selector para esa página web con la política ExtensionInstallForcelist. @@ -4011,6 +4040,7 @@ Si la estableces como falsa, no podrá usar notificac Si se establece como falsa o no se establece, se inhabilitarán las funciones de Web Components v0 de forma predeterminada, a partir de la versión M80. Después de Chrome 84, se quitará esta política. +De forma predeterminada, es posible que los documentos se ubiquen en clústeres de agentes con clave de origen . document.domain no puede establecerse para esos documentos. Envía información sobre los VPD de un dispositivo. Si estableces el valor "False" para la política o no la estableces, no se enviará la información. @@ -4788,6 +4818,7 @@ Si ninguna de las entradas tiene un valor de , se debe vincular el nombre del algoritmo del hash, una barra y la codificación de Base64 de ese algoritmo aplicada al campo codificado con DER del certificado específico. Esta codificación de Base64 tiene el mismo formato que una SPKI Fingerprint. El único algoritmo de hash compatible es sha256; se ignorarán los demás. Si no estableces esta política, considerará que no son de confianza los certificados que no se divulguen, a pesar de requerir divulgación mediante el Certificado de transparencia. +Habilitar la carga diferida de la WebUI de acceso Esta política es obsoleta y se reemplazó por AdvancedProtectionAllowed. Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada pueden enviar sus descargas a Google para comprobar que no incluyan software malicioso. Si se establece como verdadera o no se establece, se les pedirá a los usuarios inscritos que envíen sus archivos a Google para un análisis en profundidad. Si el usuario selecciona "Analizar", se enviará la descarga a Google. Si se establece como falsa, no se les pedirá a los usuarios que realicen ninguna acción y no se enviarán sus descargas a Google. @@ -6528,6 +6559,11 @@ Si no la estableces, inicialmente se inhabilitará la pantalla de privacidad, pe En , esta funcionalidad solo estará disponible en instancias que están vinculadas a un dominio de , están inscritas en o se ejecutan en Windows 10 Pro. En , esta funcionalidad solo está disponible en instancias administradas mediante MDM o vinculadas a un dominio a través de MCX. Habilitar el centro para compartir el escritorio +Si habilitas la política o no la estableces, podrá aplicar la mitigación adicional de seguridad del punto de extensión para bloquear los puntos de extensión heredados en el proceso del navegador. + + Si la inhabilitas, se reducirá la estabilidad y la seguridad de , ya que se permitirá cargar código desconocido y potencialmente hostil en el proceso del navegador de . Desactiva la política solo si hay problemas de compatibilidad con software de terceros que deba ejecutarse en el proceso del navegador de . + + Nota: Obtén más información sobre las políticas de mitigación de procesos ( https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies ). Versión de destino para las actualizaciones automáticas U2F (segundo factor universal) Si habilitas la política, el host de acceso remoto comparará el nombre del usuario local con el que está asociado el host y el nombre de la Cuenta de Google registrado como el propietario del host ("juanperez" si el host le pertenece a "juanperez@ejemplo.com"). No se iniciará el host si el nombre del propietario del host es diferente del nombre del usuario local con el que está asociado el host. Para asociar de forma forzosa la Cuenta de Google del propietario con un dominio específico, utiliza la política con . @@ -6798,6 +6834,7 @@ Si no la estableces, inicialmente se inhabilitará la pantalla de privacidad, pe Lista de servidores de autenticación habilitados Configurar el directorio de caché de disco Volver al principio +Permitir el agrupamiento en clústeres de agentes con clave de origen de forma predeterminada Configuración predeterminada Las Apps de Chrome dejaron de estar disponibles en Windows, Mac y Linux. Si se habilita esta política, seguirá permitiendo que se ejecuten las Apps de Chrome en estas plataformas hasta la fecha final en la que se quite su compatibilidad con todas las plataformas (junio de 2022). diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 6e3bf1dad4b472..a75150ed165889 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb @@ -178,6 +178,7 @@ Para obtener información detallada sobre los patrones de válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. no es un valor aceptado para esta política. Enviar información sobre ventiladores +Inhabilita la carga en diferido de la WebUI de inicio de sesión. Habilitar compatibilidad con Signed HTTP Exchange (SXG) Especifica si el dispositivo debería volver a instalar la versión establecida por si utiliza una versión posterior. @@ -486,6 +487,23 @@ Si inhabilitas esta política, se inhabilitará el desplazamiento de una página Si se asigna el valor "Verdadero" a esta política, Chrome maximizará la primera ventana que se muestre al ejecutarse por primera vez. Si se le asigna el valor "Falso" o no se le asigna ninguno, es posible que Chrome maximice la primera ventana, en función del tamaño de la pantalla. +Esta política permite los clústeres de agentes con clave de origen de forma predeterminada. + + El encabezado HTTP Origin-Agent-Cluster controla si un documento se aísla en + un clúster de agentes con clave de origen o en un clúster de agentes + con clave de sitio. Esto afecta a la seguridad, ya que un clúster de agentes + con clave de origen permite aislar los documentos según el origen. La consecuencia que + tiene para el desarrollador es que el descriptor de acceso document.domain ya no se podrá + establecer. + + El comportamiento predeterminado (cuando no hay ningún encabezado + Origin-Agent-Cluster establecido) cambia en M101 de clave de sitio a clave de origen. Si esta política + se habilita o no se establece, el navegador seguirá el nuevo comportamiento + predeterminado a partir de esa versión. Si esta política se inhabilita, el cambio se revertirá y + los documentos sin encabezados Origin-Agent-Cluster se asignarán a + clústeres de agentes con clave de sitio. Como consecuencia, el descriptor de acceso document.domain + podrá establecerse de manera predeterminada. Esto coincide con el comportamiento anterior. + Si se inhabilita esta política, desactivará la conexión Wi-Fi y los usuarios no podrán activarla. Si se habilita la política o no se establece, se permitirá que los usuarios activen y desactiven la conexión Wi-Fi. @@ -634,6 +652,7 @@ Si inhabilitas esta política, se inhabilitará el desplazamiento de una página Consulta también . Nota: Esta opción anulará (si está presente). +Carga la WebUI de inicio de sesión solo cuando es necesario. Permitir que todos los sitios establezcan datos locales Si se le asigna un valor a esta política, se especifica el porcentaje de brillo de la pantalla y se desactivan las funciones de brillo automático. El brillo inicial de la pantalla se ajusta al del valor de la política, pero los usuarios pueden cambiarlo. @@ -717,6 +736,7 @@ Si inhabilitas esta política, se inhabilitará el desplazamiento de una página Esta política es opcional. Si no se establece, la solicitud de búsqueda instantánea se enviará mediante el método GET. Esta política solo se respeta si se habilita la política "DefaultSearchProviderEnabled". +De manera predeterminada, los documentos se incluyen en clústeres de agentes con clave de sitio. El descriptor de acceso document.domain podrá establecerse. Permitir reproducción automática de contenido multimedia Advertencia: La alternativa de la versión de TLS se retirará de después de la versión 52 (en septiembre de 2016, aproximadamente) y esta política dejará de funcionar. @@ -1868,6 +1888,15 @@ Si no se le asigna ningún valor, la pantalla de privacidad se inhabilitará ini Habilitar el escritorio unificado y activarlo de forma predeterminada El usuario tiene permiso para exportar e importar contenedores Crostini a través de la UI Imprimir en modo PostScript +Esta política controla si la parte WebUI de la pantalla de inicio de sesión se cargará siempre al iniciar o solo antes de que se muestre. Esta política se aplica a la pantalla de inicio de sesión. + + Si esta política se habilita, la parte WebUI de la interfaz de inicio de sesión se cargará solo antes de que se muestre. Así, se acelera el proceso de inicio de sesión. + + Si esta política se inhabilita, la parte WebUI de la pantalla de inicio de sesión siempre se cargará al iniciar (comportamiento antiguo). + + Si no se establece, el comportamiento se controlará mediante la función kEnableLazyLoginWebUILoading. + + Esta política se debe quitar una vez que kEnableLazyLoginWebUILoading se haya lanzado completamente. Estas políticas se incluyen aquí para que sea fácil eliminarlas. Permitir al usuario utilizar aplicaciones Android de fuentes que no son de confianza Esta opción no está disponible desde la versión 29 de . La forma recomendada de configurar colecciones de aplicaciones o extensiones alojadas por una organización es incluir el sitio que aloja los paquetes CRX en la política ExtensionInstallSources y colocar enlaces de descarga directa de los paquetes en una página web. También se puede crear un menú de aplicaciones para la página web con la política ExtensionInstallForcelist. @@ -4021,6 +4050,7 @@ Si se le asigna el valor False, no utilizará notific Si no se establece esta política o se le asigna el valor "false", las funciones v0 de los componentes web se inhabilitarán de forma predeterminada desde M80. Esta política se eliminará después de la versión 84 de Chrome. +De manera predeterminada, los documentos se pueden incluir en clústeres de agentes con clave de origen. El descriptor de acceso document.domain no podrá establecerse para esos documentos. Envía información sobre VPD del dispositivo. Si se asigna el valor "false" a esta política o no se le asigna ninguno, no se enviará esta información del dispositivo. @@ -4798,6 +4828,7 @@ Si se le asigna el valor False, no utilizará notific Para especificar un hash , se vinculan el nombre del algoritmo de hash, una barra y la codificación Base64 de ese algoritmo de hash aplicado al en codificación DER del certificado especificado. La codificación Base64 tiene el mismo formato que el de una huella digital SPKI. El único algoritmo de hash reconocido es sha256; los demás se ignorarán. Si no se asigna ningún valor a esta política, los certificados que se deban comunicar a través de la transparencia en los certificados no serán de confianza para si no se comunican. +Habilita la carga en diferido de la WebUI de inicio de sesión. Esta política está obsoleta y se ha sustituido por la política AdvancedProtectionAllowed. Esta política controla si a los usuarios registrados en el Programa de Protección Avanzada se les permite enviar a Google el contenido descargado para realizar un análisis de software malicioso. Si se asigna el valor "True" a esta política o no se le asigna ningún valor, se le pedirá al usuario que envíe los archivos descargados a Google para realizar un análisis profundo. Si el usuario selecciona "Analizar", los archivos descargados se enviarán a Google. Si se le asigna el valor "False", no se le pedirá nada al usuario y los archivos descargados no se enviarán a Google. @@ -6532,6 +6563,11 @@ OverrideSecurityRestrictionsOnInsecureOrigin. Si ambas políticas están present En , esta función solo está disponible en instancias que estén vinculadas a un dominio de , que se ejecuten en Windows 10 Pro o que se hayan registrado en . En , esta función solo está disponible en instancias que se gestionen mediante MDM o que estén vinculadas a un dominio a través de MCX. Habilitar el centro para compartir escritorio +Si esta política se habilita o no se establece, se permitirá que aplique la mitigación de seguridad de puntos de extensión adicionales para bloquear puntos de extensión antiguos en el proceso del navegador. + + Si esta política se inhabilita, se reducirán la seguridad y la estabilidad de , ya que se podría cargar código desconocido y potencialmente hostil en el proceso del navegador de . Por ello, esta política solo debe inhabilitarse si hay problemas de compatibilidad con un software de terceros que deba ejecutarse en el proceso del navegador de . + + Nota: Consulta más información sobre las políticas de mitigación de procesos en la página https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies. Versión de destino de actualizaciones automáticas U2F (Universal Second Factor) Si se habilita esta política, el host de acceso remoto comparará el nombre del usuario local al que está asociado el host con el nombre de la cuenta de Google registrado como el propietario del host; por ejemplo, "juanmartinez" si el host pertenece a la cuenta de Google juanmartinez@example.com. Este host no se iniciará si el nombre del propietario del host es diferente al nombre del usuario local al que está asociado el host. Para establecer que la cuenta de Google del propietario se asocie a un dominio específico, usa esta política junto a . @@ -6802,6 +6838,7 @@ OverrideSecurityRestrictionsOnInsecureOrigin. Si ambas políticas están present Lista de permitidos de servidores de autenticación Establecer directorio de caché de disco Volver al principio +Permite los clústeres de agentes con clave de origen de forma predeterminada. Configuración predeterminada Las aplicaciones de Chrome ya no están disponibles en Windows, Mac y Linux. Si se habilita esta política, seguirá permitiendo que se ejecuten aplicaciones de Chrome en esas plataformas hasta la fecha límite en la que se eliminará la compatibilidad con todas las plataformas (junio del 2022). diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 5d797caa349c93..61c02867bb2ffa 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb @@ -178,6 +178,7 @@ Pour en savoir plus sur les formats valides, veuillez consulter la page https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. La valeur n'est pas acceptée pour cette règle. Transmettre des infos sur le ventilateur +Désactiver le chargement différé du WebUI de connexion. Activer la compatibilité avec la fonctionnalité Signed HTTP Exchange (SXG) Spécifie si la version définie par doit être rétablie sur l'appareil s'il exécute une version ultérieure. @@ -486,6 +487,12 @@ Si vous la désactivez, le défilement des pages Web vers des fragments de texte Si cette règle est définie sur "True", Chrome agrandit la première fenêtre affichée à la première exécution. Si cette règle est définie sur "False" ou qu'elle n'est pas configurée, Chrome peut agrandir la première fenêtre, selon la taille de l'écran. +Par défaut, cette règle autorise le clustering d'agents selon l'origine. + + L'en-tête HTTP Origin-Agent-Cluster permet de spécifier si un document est isolé dans un cluster d'agents selon l'origine ou selon le site. Ce choix a des implications sur la sécurité, car le clustering d'agents selon l'origine permet d'isoler des documents en fonction de l'origine. Du point de vue du développeur, cela se traduit par l'impossibilité de configurer l'accesseur document.domain. + + Le comportement par défaut (aucune configuration de l'en-tête Origin-Agent-Cluster) dans M101 n'est plus une isolation selon le site, mais selon l'origine. Si cette règle est activée ou qu'elle n'est pas configurée, le navigateur applique ce nouveau comportement par défaut à partir de cette version. Si cette règle est désactivée, ce changement est annulé et les documents sans en-têtes Origin-Agent-Cluster sont affectés aux clusters d'agents selon le site. L'accesseur document.domain reste donc configurable par défaut. Cela correspond à l'ancien comportement. + Si cette règle est désactivée, désactive le Wi-Fi. Les utilisateurs ne peuvent pas modifier ce paramètre. Si cette règle est activée ou qu'elle n'est pas configurée, les utilisateurs peuvent activer ou désactiver le Wi-Fi. @@ -636,6 +643,7 @@ Si vous la désactivez, le défilement des pages Web vers des fragments de texte Consultez également la règle "". Remarque : Ce paramètre ignore la règle "", le cas échéant. +Charger le WebUI de connexion uniquement si nécessaire. Autoriser tous les sites à définir des données locales Cette règle permet de définir le niveau de luminosité de l'écran (en pourcentage), ce qui désactive les fonctionnalités de réglage automatique de la luminosité. En outre, le niveau initial de luminosité de l'écran est ajusté à la valeur définie dans cette règle. Toutefois, les utilisateurs peuvent modifier ce paramètre. @@ -719,6 +727,7 @@ Si vous la désactivez, le défilement des pages Web vers des fragments de texte Cette règle est facultative. Si elle n'est pas définie, la requête de recherche instantanée sera envoyée à l'aide la méthode GET. Cette règle n'est respectée que si la règle "DefaultSearchProviderEnabled" est activée. +Par défaut, les documents sont placés dans des clusters d'agents selon le site, et l'accesseur document.domain reste configurable. Autoriser la lecture automatique de contenus multimédias Avertissement : Le traitement de secours de la version TLS sera supprimé de après la version 52 (vers le mois de septembre 2016), et cette règle ne sera alors plus applicable. @@ -1865,6 +1874,15 @@ Si elle n'est pas définie, l'écran de confidentialité est désactivé initial Rendre le mode bureau unifié disponible et l'activer par défaut L'utilisateur est autorisé à exporter/importer des conteneurs Crostini via l'UI Mode d'impression PostScript +Cette règle permet de définir si la partie WebUI de l'écran de connexion est systématiquement chargée au démarrage ou seulement avant de l'afficher. Cette règle s'applique à l'écran de connexion. + + Si cette règle est activée, la partie WebUI de l'écran de connexion se charge uniquement avant d'être affichée. Cela accélère le processus de connexion. + + Si cette règle est désactivée, la partie WebUI de l'écran de connexion est systématiquement chargée au démarrage (ancien comportement). + + Si elle n'est pas configurée, le comportement est contrôlé par la fonctionnalité kEnableLazyLoginWebUILoading. + + Cette règle devrait être supprimée une fois kEnableLazyLoginWebUILoading entièrement déployé. Ces règles sont incluses ici pour faciliter leur suppression. Autoriser l'utilisateur à se servir des applications Android provenant de sources non approuvées Ce paramètre a été supprimé à partir de la version 29 de . Pour configurer des collections d'extensions et d'applications hébergées par l'organisation, il est recommandé d'inclure le site hébergeant les packages CRX dans ExtensionInstallSources et d'insérer des liens directs de téléchargement dans les packages sur une page Web. Il est possible de créer un lanceur d'applications pour cette page à l'aide de la règle ExtensionInstallForcelist. @@ -4010,6 +4028,7 @@ Lorsque cette règle n'est pas configurée, le paramètre par défaut utilisé c Si elle est définie sur "False" ou si elle n'est pas définie, les fonctionnalités de Web Components v0 seront désactivées par défaut à compter de la version M80. Cette règle sera supprimée après Chrome 84. +Par défaut, les documents peuvent être placés dans des clusters d'agents selon l'origine. L'accesseur document.domain n'est pas configurable pour ces documents. Transmet des informations sur les données VPD de l'appareil. Si la règle est définie sur "False" ou n'est pas définie, ces informations ne sont pas transmises. @@ -4784,6 +4803,7 @@ Si vous sélectionnez les options suivantes : Spécifiez un hachage en concaténant le nom de l'algorithme de hachage, une barre oblique et l'encodage Base64 de cet algorithme de hachage appliqué à l'élément encodé en DER du certificat spécifié. Le format d'encodage Base64 correspond à celui d'une empreinte SPKI. SHA-256 est le seul algorithme de hachage reconnu (les autres sont ignorés). Si cette règle n'est pas configurée, cela signifie que si les certificats ne sont pas communiqués tel que le prévoient les règles de transparence des certificats, considère alors qu'ils ne sont pas fiables. +Activer le chargement différé du WebUI de connexion. Cette règle est obsolète et a été remplacée par AdvancedProtectionAllowed. Elle permet de contrôler si les utilisateurs inscrits au Programme Protection Avancée sont autorisés à envoyer leurs téléchargements à Google pour les faire analyser afin de détecter d'éventuels logiciels malveillants. Si cette règle est définie sur "True" ou si elle n'est pas configurée, ces utilisateurs sont invités à envoyer leurs téléchargements à Google pour une analyse approfondie. Si ces utilisateurs sélectionnent l'option d'analyse, leurs téléchargements sont envoyés à Google. Si cette règle est définie sur "False", aucune invite ne s'affiche, et les téléchargements des utilisateurs ne sont pas envoyés à Google. @@ -6509,6 +6529,11 @@ Il est conseillé de configurer les règles sur Windows via GPO, même si la ges Sous , cette règle n'est disponible que sur les instances associées à un domaine , exécutées sous Windows 10 Pro ou qui bénéficient de la . Sous , elle n'est disponible que sur les instances gérées via MDM ou associées à un domaine via MCX. Activer le hub de partage du bureau +Si cette règle est activée ou si elle n'est pas configurée, peut appliquer l'atténuation supplémentaire de la sécurité du point d'extension pour bloquer les anciens points d'extension du processus du navigateur. + + Si elle est désactivée, cela altère la sécurité et la stabilité de , car des codes inconnus et potentiellement hostiles pourront être chargés dans les processus du navigateur . Cette règle ne doit être désactivée qu'en cas de problèmes de compatibilité avec des logiciels tiers devant s'exécuter dans les processus du navigateur . + + Remarque : Consultez la page https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies pour en savoir plus sur les règles d'atténuation des risques liés aux processus. Cibler une version pour les mises à jour automatiques U2F (Deuxième facteur universel) Si cette règle est activée, l'hôte d'accès à distance compare le nom de l'utilisateur local auquel il est associé au nom du compte Google enregistré en tant que propriétaire de l'hôte (par exemple, "pierredupont" si l'hôte appartient à pierredupont@example.com). Cet hôte ne démarre pas si le nom de son propriétaire diffère de celui de l'utilisateur local auquel l'hôte est associé. Pour faire en sorte que le compte Google du propriétaire soit associé à un domaine spécifique, utilisez la règle avec "". @@ -6776,6 +6801,7 @@ Il est conseillé de configurer les règles sur Windows via GPO, même si la ges Liste d'autorisation des serveurs d'authentification Définir le répertoire du cache disque Haut de page +Autorise par défaut le clustering d'agents selon l'origine. Configuration par défaut Les applis Chrome sont obsolètes sur Windows, Mac et Linux. Si cette règle est activée, permettra toujours aux applis Chrome de s'exécuter sur ces plates-formes jusqu'en juin 2022, date à laquelle elles ne seront plus compatibles sur aucune plate-forme. diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index bc3db803cce6cf..97146a28733fc5 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb @@ -178,6 +178,7 @@ Untuk informasi selengkapnya tentang pola yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. bukanlah nilai yang diterima untuk kebijakan ini. Melaporkan info kipas +Nonaktifkan pemuatan WebUI Login Lambat. Aktifkan dukungan Signed HTTP Exchange (SXG) Menentukan apakah perangkat harus di-rollback ke versi yang disetel oleh jika telah menjalankan versi lebih baru. @@ -485,6 +486,23 @@ Jika Anda menonaktifkan kebijakan ini, scroll halaman web ke fragmen teks terten Jika kebijakan ditetapkan ke Benar (True), Chrome akan memaksimalkan jendela pertama yang ditampilkan saat pertama kali dijalankan. Jika kebijakan ditetapkan ke Salah (False) atau tidak ditetapkan, Chrome mungkin akan memaksimalkan jendela pertama, tergantung ukuran layar. +Kebijakan ini mengizinkan pengelompokan cluster agen dengan kunci asal secara default. + + Header HTTP Origin-Agent-Cluster: mengontrol apakah dokumen + diisolasi di cluster agen dengan kunci asal atau di cluster agen + dengan kunci situs. Hal ini berdampak pada keamanan karena cluster agen dengan kunci asal + memungkinkan isolasi dokumen menurut asal. Akibatnya, + developer tidak lagi dapat menyetel pengakses + document.domain. + + Jika tidak ada header Origin-Agent-Cluster: yang disetel, + perilaku default akan berubah dari kunci situs ke kunci asal di M101. Jika kebijakan ini + disetel ke aktif atau tidak disetel, browser akan mengikuti perilaku default baru ini mulai versi + tersebut. Jika kebijakan ini disetel ke nonaktif, perubahan tersebut akan diurungkan dan + dokumen tanpa header Origin-Agent-Cluster: akan ditetapkan ke + cluster agen dengan kunci situs. Dengan begitu, pengakses document.domain + tetap dapat disetel secara default. Perilaku ini cocok dengan perilaku lama. + Jika kebijakan disetel ke Nonaktif, akan menonaktifkan Wi-Fi, dan pengguna tidak dapat mengubahnya. Jika kebijakan disetel ke Aktif atau tidak disetel, pengguna akan dapat mengaktifkan atau menonaktifkan Wi-Fi. @@ -634,6 +652,7 @@ Jika Anda menonaktifkan kebijakan ini, scroll halaman web ke fragmen teks terten Lihat juga . Catatan: Setelan ini akan menggantikan , jika ada. +Memuat WebUI Login hanya jika diperlukan. Izinkan semua situs menyetel data lokal Menyetel kebijakan akan menentukan persentase kecerahan layar dan menonaktifkan fitur kecerahan otomatis. Kecerahan layar awal akan disesuaikan dengan nilai kebijakan, tetapi pengguna tidak dapat mengubahnya. @@ -717,6 +736,7 @@ Jika Anda menonaktifkan kebijakan ini, scroll halaman web ke fragmen teks terten Kebijakan ini bersifat opsional. Jika tidak disetel, permintaan penelusuran instan akan dikirim menggunakan metode GET. Kebijakan ini hanya dipatuhi jika kebijakan 'DefaultSearchProviderEnabled' diaktifkan. +Secara default, dokumen ditempatkan di cluster agen dengan kunci situs. document.domain tetap dapat disetel. Izinkan pemutaran otomatis media Peringatan: TLS versi pengganti akan dihapus dari setelah versi 52 (sekitar bulan September 2016) dan kebijakan ini tidak akan berlaku lagi. @@ -1868,6 +1888,15 @@ Jika kebijakan ini tidak ditetapkan, layar privasi mula-mula akan dinonaktifkan Membuat Desktop Terpadu tersedia dan aktif secara default Pengguna diaktifkan untuk mengekspor/mengimpor container Crostini melalui UI Mode PostScript Cetak +Kebijakan ini mengontrol apakah bagian WebUI pada layar login akan selalu dimuat di awal atau hanya sebelum ditampilkan. Kebijakan ini berlaku untuk layar login. + + Jika kebijakan ini disetel ke aktif, bagian WebUI pada UI login akan dimuat hanya sebelum ditampilkan. Hal ini akan mempercepat proses login. + + Jika kebijakan ini disetel ke nonaktif, bagian WebUI pada layar login akan selalu dimuat saat booting (perilaku lama). + + Jika kebijakan ini tidak disetel, perilaku akan dikontrol oleh fitur kEnableLazyLoginWebUILoading. + + Kebijakan ini akan dihapus setelah kEnableLazyLoginWebUILoading diluncurkan sepenuhnya. Kebijakan ini disertakan di sini untuk memudahkan penghapusannya. Mengizinkan pengguna menggunakan aplikasi Android dari sumber yang tidak tepercaya Setelan ini tidak lagi digunakan sejak versi 29. Cara yang disarankan untuk menyiapkan koleksi aplikasi/ekstensi yang dihosting organisasi adalah dengan menyertakan situs yang menghosting paket CRX di ExtensionInstallSources dan meletakkan link download langsung di paket dalam halaman web. Peluncur untuk halaman web tersebut dapat dibuat menggunakan kebijakan ExtensionInstallForcelist. @@ -4023,6 +4052,7 @@ Jika disetel ke Salah (False), tidak akan menggunakan Jika kebijakan ini ditetapkan ke False atau tidak ditetapkan, fitur Web Components v0 akan dinonaktifkan secara default, mulai dari M80. Kebijakan ini akan dihapus setelah Chrome 84. +Secara default, dokumen dapat ditempatkan di cluster agen dengan kunci asal. document.domain tidak dapat disetel untuk dokumen semacam ini. Melaporkan informasi VPD perangkat. Jika kebijakan ditetapkan ke salah (false) atau tidak ditetapkan, informasi tidak akan dilaporkan. @@ -4801,6 +4831,7 @@ Jika disetel ke Salah (False), tidak akan menggunakan Tentukan hash dengan menggabungkan nama algoritme hash, garis miring, dan encoding Base64 dari algoritme hash yang diterapkan ke yang dienkode DER dari sertifikat yang ditentukan. Format encoding Base64 cocok dengan Sidik Jari SPKI. Satu-satunya algoritme hash yang dikenali adalah sha256; selain itu diabaikan. Jika kebijakan tidak ditetapkan, itu berarti saat sertifikat yang memerlukan pengungkapan melalui Transparansi Sertifikat tidak diungkapkan, tidak akan memercayai sertifikat tersebut. +Aktifkan pemuatan WebUI Login Lambat. Kebijakan ini tidak digunakan lagi, dan telah diganti dengan AdvancedProtectionAllowed. Kebijakan ini mengontrol apakah pengguna yang terdaftar dalam Program Perlindungan Lanjutan diizinkan mengirimkan hasil download mereka ke Google untuk pemindaian malware. Jika ditetapkan ke Benar atau tidak ditetapkan, pengguna terdaftar akan diminta mengirimkan file mereka ke Google untuk pemindaian mendalam. Jika pengguna memilih 'Pindai', hasil download mereka akan dikirim ke Google. Jika ditetapkan ke Salah, pengguna tidak akan diminta mengirimkan hasil download ke Google. @@ -6521,6 +6552,11 @@ Kebijakan akan dihapus pada M75. Di , fungsi ini hanya tersedia di instance yang dihubungkan ke domain , dijalankan di Windows 10 Pro, atau didaftarkan di . Di , fungsi ini hanya tersedia di instance yang dikelola melalui MDM, atau dihubungkan ke domain melalui MCX. Aktifkan hub berbagi desktop +Jika kebijakan disetel ke Aktif atau tidak disetel, akan diizinkan menerapkan mitigasi keamanan titik ekstensi tambahan untuk memblokir titik ekstensi lama dalam Proses browser. + + Menyetel kebijakan ke Nonaktif akan merugikan keamanan dan stabilitas karena kode yang tidak dikenal dan berpotensi berbahaya dapat dimuat dalam proses browser . Nonaktifkan kebijakan hanya jika terdapat masalah kompatibilitas dengan software pihak ketiga yang harus berjalan dalam proses browser . + + Catatan: Baca selengkapnya tentang Kebijakan mitigasi proses ( https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies ). Versi Update Otomatis Target U2F (Universal Second Factor) Jika kebijakan disetel ke Aktif, host akses jarak jauh akan membandingkan nama pengguna lokal yang dikaitkan dengan host dan nama Akun Google yang terdaftar sebagai pemilik host (misalnya, "johan" jika host dimiliki oleh "johan@example.com"). Host ini tidak akan dimulai jika nama pemilik host berbeda dengan nama pengguna lokal yang dikaitkan dengan host. Gunakan kebijakan dengan untuk menegaskan bahwa Akun Google pemilik dikaitkan dengan domain tertentu. @@ -6791,6 +6827,7 @@ Kebijakan akan dihapus pada M75. Daftar server autentikasi yang diizinkan Setel direktori cache disk Kembali ke atas +Mengizinkan pengelompokan cluster agen dengan kunci asal secara default. Konfigurasi default Aplikasi Chrome tidak digunakan lagi di Windows, Mac, dan Linux. Jika kebijakan ini diaktifkan, akan terus mengizinkan Aplikasi Chrome dijalankan di platform berikut hingga tanggal akhir saat dukungan Aplikasi Chrome dihapus di semua platform, yakni Juni 2022. diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index c994da45cb3392..fc98c6bb4c032f 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb @@ -179,6 +179,7 @@ Per informazioni dettagliate sui pattern validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. non è un valore accettato per questo criterio. Segnala informazioni sulla ventola +Disattiva il caricamento lento di WebUI di accesso. Attiva il supporto per Signed HTTP Exchange (SXG) Consente di specificare se il dispositivo deve eseguire il rollback alla versione impostata da nel caso in cui sia già in esecuzione una versione successiva. @@ -486,6 +487,12 @@ Se disattivi questo criterio, lo scorrimento della pagina web ai frammenti di te Se il criterio è impostato su True, Chrome ingrandisce la prima finestra mostrata alla prima esecuzione. Se il criterio è impostato su False o se non viene configurato, Chrome potrebbe ingrandire la prima finestra in base alle dimensioni dello schermo. +Questo criterio consente per impostazione predefinita il clustering di agenti in base all'origine. + + L'intestazione HTTP Origin-Agent-Cluster consente di stabilire se un documento viene isolato in un cluster di agenti in base all'origine o in un cluster di agenti in base al sito. Questo comporta implicazioni relative alla sicurezza perché un cluster di agenti in base all'origine consente di isolare i documenti per origine. La conseguenza evidente di questo comportamento per gli sviluppatori è che non è più possibile impostare la funzione di accesso document.domain. + + Il comportamento predefinito (se non è stata impostata alcuna intestazione Origin-Agent-Cluster) cambia in M101 da in base al sito a in base all'origine. Se questo criterio viene attivato o se non viene configurato, il browser seguirà questo nuovo comportamento predefinito a partire dalla versione indicata. Se il criterio viene disattivato, questa modifica viene annullata e i documenti senza intestazioni Origin-Agent-Cluster verranno assegnati a cluster di agenti in base al sito. Di conseguenza, la funzione di accesso document.domain rimane configurabile per impostazione predefinita (comportamento precedente). + Se il criterio viene impostato su Disattivato, disattiva la rete Wi-Fi e gli utenti non possono modificarlo. Se viene impostato su Attivato o se non viene configurato, gli utenti possono attivare o disattivare la rete Wi-Fi. @@ -631,6 +638,7 @@ Se disattivi questo criterio, lo scorrimento della pagina web ai frammenti di te Vedi anche il criterio . Nota: questa impostazione sostituirà , se presente. +Carica WebUI di accesso soltanto quando necessario. Consenti a tutti i siti di impostare i dati locali La configurazione del criterio consente di specificare la percentuale di luminosità dello schermo, che comporta la disattivazione delle funzionalità di luminosità automatica. Il valore iniziale di luminosità dello schermo viene regolato il base al valore del criterio, ma gli utenti possono modificarlo. @@ -714,6 +722,7 @@ Se disattivi questo criterio, lo scorrimento della pagina web ai frammenti di te Questa norma è facoltativa. Se non viene impostata, la richiesta di ricerca istantanea verrà inviata utilizzando il metodo GET. Questa norma viene rispettata soltanto se la norma "DefaultSearchProviderEnabled" è attiva. +Per impostazione predefinita, i documenti vengono inseriti in cluster di agenti in base al sito. La funzione di accesso document.domain rimane configurabile. Consenti la riproduzione automatica dei contenuti multimediali Avviso. Il fallback della versione TLS sarà rimosso da dopo la versione 52 (nel periodo settembre 2016), dopodiché questa norma non sarà più attiva. @@ -1863,6 +1872,15 @@ Questa norma viene rispettata soltanto se viene attivata la norma "DefaultSearch Rendi disponibile la modalità Desktop unificato e attivala per impostazione predefinita L'utente è abilitato a importare/esportare contenitori Crostini tramite l'interfaccia Modalità di stampa PostScript +Questo criterio consente di stabilire se la parte WebUI della schermata di accesso verrà sempre caricata all'inizio o soltanto prima di essere mostrata. Questo criterio si applica alla schermata di accesso. + + Se questo criterio viene attivato, la parte WebUI dell'interfaccia utente di accesso verrà caricata soltanto prima di essere mostrata. In questo modo la procedura di accesso diventa più veloce. + + Se questo criterio viene disattivato, la parte WebUI della schermata di accesso verrà caricata sempre all'avvio (comportamento precedente). + + Se il criterio non viene configurato, il comportamento sarà gestito tramite la funzionalità kEnableLazyLoginWebUILoading. + + Questo criterio sarà rimosso dopo l'implementazione completa della funzionalità kEnableLazyLoginWebUILoading. Queste norme sono incluse qui in modo che sia più facile rimuoverle. Consenti all'utente di usare app Android di fonti non attendibili Questa impostazione non è più supportata a partire dalla versione 29 di . Il metodo consigliato per la configurazione di raccolte di estensioni/app ospitate dall'organizzazione consiste nell'includere il sito che ospita i pacchetti CRX in ExtensionInstallSources e inserire link di download diretti per i pacchetti in una pagina web. È possibile creare una funzione Avvio applicazioni per la pagina web utilizzando la norma ExtensionInstallForcelist. @@ -4003,6 +4021,7 @@ Se il criterio viene configurato, gli utenti non possono apportare modifiche. Gl Se questo criterio viene impostato su False o non viene impostato, le funzionalità Web Components v0 verranno disattivate per impostazione predefinita a partire dalla versione M80. Questo criterio verrà rimosso nelle versioni successive alla versione 84 di Chrome. +Per impostazione predefinita, i documenti potrebbero essere inseriti in cluster di agenti in base all'origine. La funzione di accesso document.domain non è configurabile per questi documenti. Segnala informazioni sui VPD di un dispositivo. Se il criterio è impostato su False o non è configurato, le informazioni non vengono segnalate. @@ -4779,6 +4798,7 @@ Se il criterio viene configurato, gli utenti non possono apportare modifiche. Gl Specifica un hash collegandolo al nome dell'algoritmo di hash, una barra e la codifica Base64 di tale algoritmo di hash applicato al con codifica DER del certificato specificato. Il formato della codifica Base64 è nello stesso formato di un'impronta SPKI. L'unico algoritmo di hash riconosciuto è sha256; gli altri vengono ignorati. Se il criterio non è configurato e se i certificati che richiedono la divulgazione tramite Certificate Transparency non vengono divulgati, non ritiene attendibili gli altri certificati. +Attiva il caricamento lento di WebUI di accesso. Questo criterio è obsoleto ed è stato sostituito dal criterio AdvancedProtectionAllowed. Questo criterio consente di stabilire se gli utenti iscritti al programma di protezione avanzata possono inviare o meno i propri download a Google per verificare l'eventuale presenza di malware. Se il criterio viene impostato su True o non viene impostato, agli utenti iscritti al programma verrà chiesto di inviare i propri file a Google per una scansione approfondita. Se l'utente seleziona "Scansiona", il download verrà inviato a Google. Se il criterio viene impostato su False, agli utenti non verrà chiesto di inviare i propri download a Google. @@ -6495,6 +6515,11 @@ Se questa norma non viene impostata, le pagine saranno sottoposte a scansione pe Su , questa funzionalità è disponibile soltanto nelle istanze che fanno parte di un dominio , sono in esecuzione su Windows 10 Pro o sono registrate in . Su , questa funzionalità è disponibile soltanto nelle istanze gestite tramite MDM o aggiunte a un dominio tramite MCX. Attiva hub di condivisione desktop +Se il criterio viene impostato su Attivato o se non viene configurato, potrà applicare la riduzione dei rischi di sicurezza dei punti di estensioni aggiuntivi per bloccare i punti di estensioni precedenti nel processo del browser. + + Se il criterio viene impostato su Disattivato, la sicurezza e la stabilità di diminuiranno, perché sarà possibile caricare codice sconosciuto e potenzialmente dannoso all'interno del processo del browser di . Disattiva il criterio soltanto se si verificano problemi di compatibilità con software di terze parti che devono essere eseguiti all'interno del processo del browser di . + + Nota: scopri di più sui criteri relativi alla mitigazione dei processi (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies). Scegli versione target dell'aggiornamento automatico U2F (Universal Second Factor) Se il criterio viene impostato su Attivato, l'host di accesso remoto confronta il nome dell'utente locale a cui è associato l'host con il nome dell'Account Google registrato come proprietario dell'host ("mariorossi" se l'host è di proprietà dell'Account Google "mariorossi@example.com"). Questo host non viene avviato se il nome del proprietario dell'host non coincide con quello dell'utente locale a cui è associato l'host. Per forzare l'associazione dell'Account Google del proprietario con un dominio specifico, usa il criterio insieme a . @@ -6763,6 +6788,7 @@ Se la norma non viene impostata o viene impostata su false, la posizione non vie Lista consentita di server di autenticazione Impostazione directory della cache su disco Torna all'inizio +Consente per impostazione predefinita il clustering di agenti in base all'origine. Configurazione predefinita Le app di Chrome sono state ritirate su Windows, Mac e Linux. Se questo criterio viene attivato, continuerà a consentire l'esecuzione delle app di Chrome su queste piattaforme fino alla data ultima del ritiro del supporto di queste app su tutte le piattaforme, vale a dire giugno 2022. diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index a39e95fc66ceee..036a898eaf1ca6 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb @@ -178,6 +178,7 @@ 유효한 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. 는 이 정책에 허용되는 값이 아닙니다. 팬 정보 보고 +Lazy Login WebUI 로딩을 사용 중지합니다. 서명된 HTTP 교환(SXG) 지원 사용 설정 기기가 이미 이후 버전을 실행하는 경우 기기를 에 설정된 버전으로 롤백할지 여부를 지정합니다. @@ -486,6 +487,13 @@ 정책을 True로 설정하면 Chrome에서 최초 실행 시 표시되는 첫 번째 창을 최대화합니다. 정책을 False로 설정하거나 설정하지 않으면 Chrome에서 화면 크기에 따라 첫 번째 창을 최대화할 수 있습니다. +이 정책은 기본적으로 출처 관련 에이전트 클러스터링을 허용합니다. + + Origin-Agent-Cluster: HTTP 헤더는 문서를 출처 관련 에이전트 클러스터에서 분리할지 아니면 사이트 관련 에이전트 클러스터에서 분리할지를 제어합니다. 출처 관련 에이전트 클러스터에서는 문서를 출처 기준으로 분리하는 것이 허용되므로 보안에 영향을 줍니다. 가시적인 결과는 개발자가 더 이상 document.domain 접근자를 설정할 수 없게 되는 것입니다. + + Origin-Agent-Cluster: 헤더가 설정되지 않았을 때 M101의 기본값은 + - 사이트 관련 동작에서 출처 관련 동작으로 변경됩니다. 정책을 사용 설정하거나 설정하지 않으면 브라우저는 해당 버전부터 이 새로운 기본값을 따릅니다. 정책을 사용 중지하면 변경사항이 취소되고 Origin-Agent-Cluster: 헤더가 없는 문서는 사이트 관련 에이전트 클러스터에 할당됩니다. 그 결과 document.domain 접근자는 기본적으로 설정 가능한 상태로 유지됩니다. 이는 레거시 동작과 일치합니다. + 정책을 사용 중지하면 제품이 Wi-Fi를 사용 중지하며 사용자가 이를 변경할 수 없습니다. 사용 설정하거나 설정하지 않으면 사용자가 Wi-Fi를 사용 설정 또는 중지할 수 있습니다. @@ -635,6 +643,7 @@ 도 참고하세요. 이 있더라도 이 설정이 우선 적용됩니다. +필요할 때만 Login WebUI를 로드합니다. 모든 사이트에서 로컬 데이터 설정 허용 정책을 설정하면 화면 밝기 비율을 지정할 수 있으며 자동 밝기 기능이 사용 중지됩니다. 초기 화면 밝기는 정책 값으로 조정되지만 사용자가 변경할 수 있습니다. @@ -718,6 +727,7 @@ 이 정책은 선택사항입니다. 설정되지 않으면 순간 검색 요청은 GET 메소드를 사용하여 전송됩니다. 이 정책은 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정한 경우에만 적용됩니다. +기본적으로 문서는 사이트 관련 에이전트 클러스터에 배치되고 document.domain은 설정 가능한 상태로 유지됩니다. 미디어 자동 재생 허용 경고: TLS 버전 대체 수단이 2016년 9월경 버전 52 이후부터 에서 삭제되며 그 이후부터 이 정책이 작동 중지됩니다. @@ -1868,6 +1878,15 @@ False로 설정하면 개인정보 보호 화면은 항상 사용 중지됩니 통합 바탕화면을 기본적으로 허용하고 사용 설정합니다. 사용자가 UI를 통해 Crostini 컨테이너를 내보내고 가져올 수 있음 인쇄 PostScript 모드 +로그인 화면의 WebUI 부분을 시작할 때 항상 로드할지, 아니면 로그인 화면을 표시하기 전에만 로드할지 결정하는 정책입니다. 이 정책은 로그인 화면에 적용됩니다. + + 정책이 사용 설정되어 있으면 로그인 UI에서 WebUI 부분이 로그인 화면을 표시하기 전에만 로드됩니다. 따라서 로그인 과정이 빨라집니다. + + 정책을 사용 중지하면 로그인 화면의 WebUI 부분을 부팅 시 항상 로드하고(레거시 동작), + + 설정하지 않으면 kEnableLazyLoginWebUILoading 기능으로 동작을 제어하게 됩니다. + + kEnableLazyLoginWebUILoading이 완전히 출시되면 이 정책은 삭제됩니다. 간편하게 삭제할 수 있도록 정책이 여기에 표시됩니다. 사용자가 신뢰할 수 없는 출처의 Android 앱을 사용하도록 허용 이 설정은 버전 29를 기준으로 지원 중단되었습니다. 기관/단체에서 호스팅하는 확장 프로그램/앱 컬렉션을 설정하는 가장 좋은 방법은 CRX 패키지를 호스팅하는 사이트를 ExtensionInstallSources에 포함시키고 패키지에 대한 직접 다운로드 링크를 웹페이지에 제공하는 것입니다. 웹페이지 런처는 ExtensionInstallForcelist 정책을 사용하여 만들 수 있습니다. @@ -4019,6 +4038,7 @@ False로 설정하면 에서 시스템 알림을 사 False로 설정되어 있거나 설정되어 있지 않은 경우 Web Components v0 기능이 M80에서부터 기본적으로 사용 중지됩니다. 이 정책은 Chrome 84 이후 삭제됩니다. +기본적으로 문서를 출처 관련 에이전트 클러스터에 배치할 수 있고 이러한 문서에 대해 document.domain을 설정할 수 없습니다. 기기의 VPD 정보를 보고합니다. 정책을 False로 설정하거나 설정하지 않으면 정보가 보고되지 않습니다. @@ -4797,6 +4817,7 @@ False로 설정하면 에서 시스템 알림을 사 해시 알고리즘 이름, 슬래시 및 지정된 인증서의 DER 인코딩 에 적용된 해시 알고리즘 Base64 인코딩을 연결하여 해시를 지정합니다. Base64 인코딩 형식은 SPKI 지문 형식과 일치합니다. 유일하게 인식되는 해시 알고리즘은 sha256이고 다른 모든 알고리즘은 무시됩니다. 정책을 설정하지 않으면 인증서 투명성을 통해 공개해야 하는 인증서가 공개되지 않은 경우 에서 인증서를 신뢰하지 않습니다. +Lazy Login WebUI 로딩을 사용 설정합니다. 지원이 중단되어 AdvancedProtectionAllowed로 대체된 정책입니다. 이 정책은 고급 보호 프로그램에 등록된 사용자가 Google에 다운로드 항목을 전송하여 멀웨어가 있는지 검사하도록 허용할지 결정합니다. 정책이 True로 설정되거나 설정되지 않으면 등록된 사용자에게 파일을 Google에 전송하여 심층 검사를 받으라는 메시지가 표시됩니다. 이때 사용자가 '검사'를 선택하면 다운로드 항목이 Google로 전송됩니다. False로 설정되면 사용자에게 메시지가 표시되지 않으며 다운로드한 파일이 Google에 전송되지 않습니다. @@ -6528,6 +6549,11 @@ Windows에서는 GPO를 통해 정책을 설정하는 것이 좋습니다. 하 의 경우 이 기능은 도메인에 연결된 인스턴스, Windows 10 Pro에서 실행되는 인스턴스 또는 에 등록된 인스턴스에서만 사용할 수 있습니다. 의 경우에는 MDM을 통해 관리되는 인스턴스 또는 MCX를 통해 도메인에 연결된 인스턴스에서만 사용할 수 있습니다. 데스크톱 공유 허브 사용 설정 +정책을 사용 설정하거나 설정하지 않으면 에서 추가 확장 포인트 보안 완화를 적용하여 브라우저 프로세스 중 레거시 확장 포인트를 차단할 수 있습니다. + + 정책을 사용 중지하면 악성일 가능성이 있는 알려지지 않은 코드가 의 브라우저 프로세스 내에서 로드될 수 있으므로 의 보안 및 안정성에 부정적인 영향을 미칩니다. 의 브라우저 프로세스 내에서 실행되어야 하는 타사 소프트웨어에 호환성 문제가 발생하는 경우에만 정책을 사용 중지하세요. + + 참고: 프로세스 완화 정책(https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies)에 관해 자세히 알아보세요. 자동 업데이트 버전 타겟팅 U2F(범용 2차 요소) 정책을 사용 설정하면 원격 액세스 호스트가 호스트와 연결된 로컬 사용자의 이름과 호스트 소유자로 등록된 Google 계정의 이름(호스트 소유자가 'johndoe@example.com'인 경우 'johndoe')을 비교합니다. 호스트 소유자의 이름이 호스트와 연결된 로컬 사용자의 이름과 다르면 이 호스트는 시작되지 않습니다. 소유자의 Google 계정이 특정 도메인에 연결되도록 하려면 과 정책을 함께 사용합니다. @@ -6796,6 +6822,7 @@ Windows에서는 GPO를 통해 정책을 설정하는 것이 좋습니다. 하 인증 서버 허용 목록 디스크 캐시 디렉터리 설정 맨위로 +기본적으로 출처 관련 에이전트 클러스터링을 허용합니다. 기본 구성 Windows, Mac, Linux에서 Chrome 앱의 지원이 중단되었습니다. 정책을 사용 설정하면 Chrome 앱 지원이 모든 플랫폼에서 삭제되는 2022년 6월의 마지막 날짜까지 에서 Chrome 앱이 이러한 플랫폼에서 실행되도록 허용합니다. diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 789cd9a0930923..7099f443dad5f1 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb @@ -178,6 +178,7 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige -patronen. is geen geaccepteerde waarde voor dit beleid. Ventilatorgegevens rapporteren +Lazy loading van WebUI voor inloggen uitzetten. Signed HTTP Exchange-ondersteuning (SXG) aanzetten Geeft aan of het apparaat moet terugkeren naar de versie die is ingesteld met als er al een latere versie is geïnstalleerd. @@ -486,6 +487,12 @@ Als je dit beleid niet toepast, wordt op de webpagina naar specifieke tekstfragm Als je het beleid instelt op True, maximaliseert Chrome het eerste venster tijdens de eerste uitvoering. Als je het beleid instelt op False of niet instelt, kan Chrome het eerste venster mogelijk maximaliseren, afhankelijk van de schermgrootte. +Dit beleid staat origin-keyed agentclustering standaard toe. + + De HTTP-header Origin-Agent-Cluster: bepaalt of een document wordt geïsoleerd in een origin-keyed agentcluster of in een site-keyed agentcluster. Dit heeft beveiligingsimplicaties omdat een origin-keyed agentcluster isolatie van documenten op basis van oorsprong toestaat. Het voor de ontwikkelaar zichtbare gevolg hiervan is dat de accessor document.domain niet meer kan worden ingesteld. + + Het standaardgedrag (wanneer er geen header Origin-Agent-Cluster: is ingesteld) verandert in M101 van site-keyed naar origin-keyed. Als je dit beleid toepast of niet instelt, volgt de browser deze nieuwe standaardwaarde vanaf die versie. Als je dit beleid niet toepast, wordt deze wijziging teruggedraaid en worden documenten zonder een header Origin-Agent-Cluster: toegewezen aan site-keyed agentclusters. Als gevolg hiervan blijft de accessor document.domain standaard instelbaar. Dit komt overeen met het verouderde gedrag. + Als je het beleid niet toepast, zet wifi uit en kunnen gebruikers dit niet wijzigen. Als je het beleid niet toepast of niet instelt, kunnen gebruikers wifi aan- of uitzetten. @@ -636,6 +643,7 @@ Het veld is beëindigd ten Zie ook . Opmerking: Deze instelling overschrijft (indien aanwezig). +WebUI voor inloggen alleen laden indien nodig. Alle sites toestaan lokale gegevens in te stellen Als je het beleid instelt, wordt de helderheid van het scherm als percentage ingesteld en worden de functies voor automatische helderheid uitgezet. Het scherm heeft aanvankelijk de helderheid van de beleidswaarde, maar gebruikers kunnen deze aanpassen. @@ -719,6 +727,7 @@ Het veld is beëindigd ten Dit beleid is optioneel. Als het beleid niet is ingesteld, wordt de instantzoekopdracht verstuurd met de GET-methode. Dit beleid wordt alleen gerespecteerd als het beleid DefaultSearchProviderEnabled is toegepast. +Standaard worden documenten in site-keyed agentclusters geplaatst. document.domain blijft instelbaar. Automatisch afspelen van media toestaan Waarschuwing: De TLS-fallbackversie wordt na de lancering van versie 52 (rond september 2016) uit verwijderd. Vanaf dat moment werkt dit beleid niet meer. @@ -1850,6 +1859,15 @@ Als je dit beleid niet instelt, geldt de standaardwaarde 'niet toegestaan' voor Maak Samengestelde desktop beschikbaar en zet deze standaard aan Gebruiker kan Crostini-containers exporteren/importeren via de gebruikersinterface Modus voor PostScript-afdrukken +Dit beleid bepaalt of het WebUI-gedeelte van het inlogscherm altijd wordt geladen bij het opstarten of alleen voordat het wordt getoond. Dit beleid is van toepassing op het inlogscherm. + + Als je dit beleid toepast, wordt het WebUI-gedeelte van de inlog-UI alleen geladen voordat het wordt getoond. Dit versnelt het inlogproces. + + Als je dit beleid niet toepast, wordt het WebUI-gedeelte van het inlogscherm altijd geladen bij het opstarten (verouderd gedrag). + + Als je dit beleid niet instelt, wordt het gedrag bepaald door de functie kEnableLazyLoginWebUILoading. + + Dit beleid moet worden verwijderd nadat kEnableLazyLoginWebUILoading helemaal is uitgerold. Deze beleidsregels zijn hier opgenomen zodat je ze makkelijk kunt verwijderen. Toestaan dat de gebruiker Android-apps van niet-vertrouwde bronnen gebruikt Deze instelling wordt niet meer gebruikt sinds versie 29. De aanbevolen manier om verzamelingen van extensies/apps die door de organisatie worden gehost in te stellen, is het opnemen van de site die de CRX-pakketten in ExtensionInstallSources host en het plaatsen van rechtstreekse downloadlinks naar de pakketten op een webpagina. Je kunt voor die webpagina een startprogramma maken met het beleid ExtensionInstallForcelist. @@ -3978,6 +3996,7 @@ Als je dit beleid instelt, kun je bepalen of een gebruiker mag inloggen bij +Documenten kunnen standaard in origin-keyed agentclusters worden geplaatst. document.domain is niet instelbaar voor dergelijke documenten. Rapporteer de VPD-gegevens van een apparaat. Als het beleid is ingesteld op False of niet is ingesteld, worden de gegevens niet gerapporteerd. @@ -4729,6 +4748,7 @@ Als je ervoor kiest het volgende te gebruiken: Geef een -hash op door de naam van het hash-algoritme, een slash en de Base64-codering van het betreffende toegepaste hash-algoritme te koppelen aan de met DER-codering van het opgegeven certificaat. Een indeling met Base64-codering komt overeen met die van een SPKI-vingerafdruk. Het enige herkende hash-algoritme is sha256. Andere algoritmen worden genegeerd. Als je het beleid niet instelt, betekent dit dat als certificaten die openbaar moeten worden gemaakt via Certificaattransparantie niet openbaar worden gemaakt, de betreffende certificaten niet door worden vertrouwd. +Lazy loading van WebUI voor inloggen aanzetten. Dit beleid is beëindigd en is vervangen door AdvancedProtectionAllowed. Met dit beleid wordt bepaald of gebruikers die zijn ingeschreven bij 'Geavanceerde beveiliging' hun downloads naar Google mogen sturen om ze te laten scannen. Als dit beleid is ingesteld op True of niet is ingesteld, wordt ingeschreven gebruikers gevraagd hun bestanden naar Google te sturen voor een uitgebreide scan. Als gebruikers 'Scannen' selecteren, worden hun downloads naar Google gestuurd. Als dit beleid is ingesteld op False, ontvangen gebruikers geen melding en worden hun downloads niet naar Google gestuurd. @@ -6446,6 +6466,11 @@ Dit beleid geldt per frame en is niet alleen gebaseerd op de oorspronkelijke URL In is deze functionaliteit alleen beschikbaar voor instanties die zijn gekoppeld aan een -domein, worden uitgevoerd in Windows 10 Pro of zijn ingeschreven voor . In is deze functionaliteit alleen beschikbaar voor instanties die via MDM worden beheerd of via MCX aan een domein zijn gekoppeld. Hub voor delen van bureaublad aanzetten +Als je het beleid toepast of niet instelt, kan de aanvullende beveiligingsbeperking voor extensiepunten toepassen om verouderde extensiepunten in het browserproces te blokkeren. + + Als je dit beleid niet toepast, heeft dit een nadelige invloed op de beveiliging en stabiliteit van , omdat onbekende en potentieel schadelijke code kan worden geladen in het browserproces van . Pas het beleid alleen niet toe als er compatibiliteitsproblemen zijn met software van derden die in het browserproces van moet worden uitgevoerd. + + Opmerking: Lees meer informatie over het beleid voor procesbeperking (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies). Doelversie voor automatische updates U2F (Universal Second Factor) Als je dit beleid toepast, vergelijkt de host voor externe toegang de naam van de lokale gebruiker waaraan de host is gekoppeld, met de naam van het Google-account dat is geregistreerd als eigenaar van de host (bijvoorbeeld 'jansmits' als de host eigendom is van het Google-account jansmits@example.com). Deze host wordt niet gestart als de naam van de hosteigenaar anders is dan de naam van de lokale gebruiker waaraan de host is gekoppeld. Als je wilt afdwingen dat het Google-account van de eigenaar wordt gekoppeld aan een specifiek domein, gebruik je het beleid met . @@ -6713,6 +6738,7 @@ Dit beleid geldt per frame en is niet alleen gebaseerd op de oorspronkelijke URL Toelatingslijst voor verificatieserver Directory voor schijfcache instellen Bovenkant pagina +Staat origin-keyed agentclustering standaard toe. Standaard configuratie Chrome-apps worden beëindigd voor Windows, Mac en Linux. Als je dit beleid aanzet, staat nog steeds toe dat Chrome-apps worden uitgevoerd op deze platforms, tot de einddatum van juni 2022. Op dat moment wordt ondersteuning voor Chrome-apps op alle platforms verwijderd. diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index be8b3ceec423b7..19204e9edc5452 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb @@ -175,6 +175,7 @@ Подробнее о допустимых шаблонах : https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение не поддерживается для этого правила. Передача информации о вентиляторе устройства +Отключить загрузку отложенного входа WebUI Разрешить поддержку Signed HTTP Exchange (SXG) Определяет, следует ли устройству вернуться к версии, определенной правилом , если на нем уже установлена более поздняя версия. @@ -483,6 +484,12 @@ Если для правила задано значение True, Chrome будет всегда разворачивать первое окно при начальном запуске. Если правило не настроено или задано значение False, решение о том, разворачивать ли первое окно, будет приниматься исходя из размера экрана. +Это правило по умолчанию разрешает кластеризацию агента с ключом источника. + + HTTP-заголовок Origin-Agent-Cluster определяет, изолирован ли документ в кластере агента с ключом источника или кластере агента с ключом сайта. Это влияет на безопасность, так как кластер агента с ключом источника позволяет изолировать документы по источнику. Поэтому разработчик больше не сможет настроить метод доступа document.domain. + + Поведение по умолчанию. Если заголовок Origin-Agent-Cluster не задан, в версии M101 вместо ключа сайта используется ключ источника. Если правило включено или не настроено, браузер будет следовать новому значению по умолчанию из этой версии. Если правило отключено, это изменение отменяется и документы без заголовка Origin-Agent-Cluster будут назначены кластерам агента с ключом сайта. После этого метод доступа document.domain можно будет настроить по умолчанию. Это соответствует устаревшему поведению. + Если правило отключено, в не будет работать Wi-Fi и пользователи не смогут изменить это. Если правило включено или не настроено, пользователи смогут включать и отключать Wi-Fi. @@ -632,6 +639,7 @@ См. также . Это правило переопределяет правило , если оно настроено. +Загружать элемент WebUI только при необходимости Разрешить всем сайтам сохранять локальные данные Устанавливает уровень яркости экрана в процентах. Функция адаптивной яркости будет отключена. Изначально яркость экрана устанавливается в соответствии с правилом, но пользователи могут изменить этот параметр. @@ -715,6 +723,7 @@ Данная политика является необязательной. Если она не задана, для Живого поиска используется метод GET. Данная политика действует только в случае, если включена политика 'DefaultSearchProviderEnabled'. +По умолчанию документы помещены в кластеры агента с ключом сайта. Для них можно настроить метод доступа document.domain. Разрешить автоматическое воспроизведение видео Внимание! После выхода версии 52 (примерно в сентябре 2016 г.) возможность отката TLS будет удалена из , и это правило перестанет работать. @@ -1851,6 +1860,15 @@ Включить режим единого рабочего стола и установить его по умолчанию Пользователю разрешено экспортировать и импортировать контейнеры Crostini, используя интерфейс Режим печати PostScript +Это правило определяет, будет ли элемент WebUI экрана входа загружаться только перед его показом или при запуске устройства. Оно применяется к экрану входа. + + Если правило включено, элемент WebUI экрана входа будет загружаться только перед его показом. Это ускорит процесс входа. + + Если правило отключено, элемент WebUI экрана входа будет всегда загружаться при запуске устройства (устаревшее поведение). + + Если правило не настроено, поведение будет контролироваться функцией kEnableLazyLoginWebUILoading. + + После ее внедрения это правило будет удалено. Эти правила объединены в отдельную папку, чтобы их было проще удалить. Разрешить использование приложений для Android из ненадежных источников Это правило не поддерживается в версии 29 и будет исключено из более поздних версий. Чтобы создать коллекцию приложений и расширений организации, рекомендуем указать адрес сайта, где хранятся CRX-пакеты, в правиле ExtensionInstallSources и разместить прямые ссылки на скачивание приложений на специальной веб-странице. Панель запуска для этой страницы можно создать с помощью правила ExtensionInstallForcelist. @@ -3998,6 +4016,7 @@ Если установлено значение False или правило не настроено, указанные функции будут по умолчанию отключены (начиная с версии M80). Правило будет удалено из Chrome после версии 84. +По умолчанию документы могут быть помещены в кластеры агента с ключом источника. Для них нельзя настроить метод доступа document.domain. Передача информации об основных данных о продукте (VPD). Если правило не настроено или задано значение False, сведения не отправляются. @@ -4772,6 +4791,7 @@ Чтобы задать хеш , следует объединить название алгоритма хеширования, символ "/" и представленный в кодировке Base64 результат применения алгоритма хеширования к DER-представлению нужного сертификата. Кодировка SPKI Fingerprint основана на формате Base64. Единственный алгоритм хеширования, поддерживаемый на текущий момент, – sha256. Если правило не настроено, то будет считать ненадежными любые сертификаты, не прошедшие проверку безопасности. +Включить загрузку отложенного входа WebUI Это правило устарело и было заменено правилом AdvancedProtectionAllowed. Это правило определяет, разрешено ли пользователям, зарегистрированным в программе Дополнительной защиты, отправлять скачиваемые файлы в Google для проверки на наличие вредоносного ПО. Если правило не настроено или для него задано значение True, пользователям, зарегистрированным в программе Дополнительной защиты, при скачивании файлов будет предлагаться отправлять их в Google для глубокого сканирования. Если пользователь нажмет "Сканировать", скачиваемый файл будет отправлен на проверку в Google. Если для правила указано значение False, пользователям, зарегистрированным в программе Дополнительной защиты, не будет предлагаться отправлять скачиваемые файлы в Google. @@ -6495,6 +6515,11 @@ В это правило можно настроить только на устройствах из домена , на которых установлена ОС Windows 10 Pro или которые зарегистрированы в программе "". В правило поддерживается только на устройствах, которые контролируются с помощью ПО для управления мобильными устройствами или добавлены в домен через MCX. Включить функцию "Центр общего доступа к рабочему столу" +Если правило включено или не настроено, сможет выполнить дополнительную проверку безопасности точек расширения, чтобы заблокировать устаревшие точки расширения в процессе браузера. + + Отключение правила негативно скажется на безопасности и стабильности , так как внутри процесса браузера станет возможна загрузка неизвестного и потенциально вредоносного кода. Правило можно отключить, только если возникают проблемы совместимости со сторонним ПО, которое нужно запускать внутри процесса браузера . + + Примечание. Подробную информацию можно найти здесь: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies. Выбор версии автообновления U2F (Universal Second Factor) Если правило включено, хост удаленного доступа сравнивает имя связанного с ним локального пользователя с названием аккаунта Google, принадлежащего владельцу хоста (например, ivanpetrov, если хост принадлежит аккаунту ivanpetrov@example.com). Хост не запустится, если имена владельца и локального пользователя не совпадут. Чтобы также связать аккаунт Google, принадлежащий владельцу хоста, с определенным доменом (например, example.com), используйте это правило вместе с правилом . @@ -6765,6 +6790,7 @@ Список разрешенных серверов для аутентификации Установка каталога кеша на диске В начало +Разрешает кластеризацию агента с ключом источника Конфигурация по умолчанию Поддержка приложений Chrome в Windows, macOS и Linux прекращена. Если правило включено, будет разрешать запуск приложений Chrome на данных платформах до даты прекращения их поддержки на всех платформах в июне 2022 года. diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index df75b4e1761d94..74e390951f7090 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb @@ -178,6 +178,7 @@ Докладніше про дійсні шаблони -адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. – недопустиме значення для цього правила. Повідомляти дані про вентилятор +Вимкнути відкладене завантаження WebUI для екрана входу. Увімкнути підтримку Signed HTTP Exchange (SXG) Указує, чи відкочуватися до версії, яку зазначено в правилі , якщо на пристрої вже встановлено новішу версію. @@ -485,6 +486,23 @@ Якщо для цього правила вибрано значення True, Chrome розгортає перше вікно, яке відкривається під час першого запуску. Якщо для цього правила вибрано значення False або його не налаштовано, вікно в Chrome розгортатиметься залежно від розміру екрана. +Це правило дозволяє за умовчанням кластеризувати агенти за ключем джерела. + + HTTP-заголовок Origin-Agent-Cluster визначає, як ізолювати документ + у кластері агентів: за ключем джерела чи за ключем + сайту. Це впливає на безпеку, оскільки кластеризація агентів за ключем джерела + дозволяє ізолювати документи за джерелом. Розробники також + не зможуть налаштувати метод доступу + document.domain. + + За умовчанням (тобто якщо не вказано заголовок Origin-Agent-Cluster) з версії M101 і далі + кластеризація відбуватиметься за ключем джерела, а не ключем сайту. Якщо це правило + ввімкнути або не налаштувати, ця нова поведінка за умовчанням застосовуватиметься, + починаючи зі згаданої версії веб-переглядача. Якщо правило вимкнути, ця зміна скасується, а + документи без заголовків Origin-Agent-Cluster включатимуться в + кластери агентів за ключем сайту. Тому метод доступу document.domain + за умовчанням можна буде налаштувати. Це відповідає застарілій поведінці. + Якщо це правило вимкнено, деактивовує Wi-Fi, а користувачі не можуть змінити цей параметр. Якщо це правило ввімкнено або не налаштовано, користувачі можуть вмикати й вимикати Wi-Fi. @@ -634,6 +652,7 @@ Також перегляньте правило . Примітка: правило RemoteAccessHostDomainList замінює правило , якщо воно наявне. +Завантажувати WebUI для екрана входу лише в разі потреби. Дозволити всім сайтам установлювати локальні дані Це правило визначає відсоток яскравості екрана. Функції адаптації яскравості вимикаються. Початкова яскравість екрана коригується відповідно до значення правила, проте користувачі можуть змінити її пізніше. @@ -717,6 +736,7 @@ Це правило необов’язкове. Якщо його не встановлено, запит на миттєвий пошук надсилається методом GET. Це правило застосовується, лише якщо ввімкнено правило "DefaultSearchProviderEnabled". +За умовчанням документи включаються в кластери агентів із ключем сайту. Метод доступу document.domain і надалі можна налаштовувати. Дозволити автоматичне відтворення медіафайлів Застереження. Перехід до старішої версії TLS буде скасовано у версіях , новіших за 52 (це станеться приблизно у вересні 2016 року). Тоді ж перестане працювати це правило. @@ -1867,6 +1887,15 @@ За умовчанням робити доступним і вмикати уніфікований режим робочого стола Користувач може експортувати або імпортувати контейнери Crostini через інтерфейс Режим друку PostScript +Це правило визначає, коли завантажувати частину WebUI екрана входу: під час запуску чи лише перед його показом. Воно діє для екрана входу. + + Якщо правило ввімкнути, частина WebUI інтерфейсу входу завантажуватиметься лише перед його показом. Це прискорює процес входу. + + Якщо правило вимкнути, частина WebUI екрана входу завжди завантажуватиметься під час запуску (застаріла поведінка). + + Якщо його не налаштовувати, відповідною поведінкою керуватиме функція kEnableLazyLoginWebUILoading. + + Це правило потрібно буде вилучити, коли ми остаточно випустимо функцію kEnableLazyLoginWebUILoading. Ці правила зазначені тут, щоб їх було легко видалити. Дозволити користувачеві завантажувати додатки для Android із ненадійних джерел Це налаштування не підтримується від 29-ї версії . Рекомендований спосіб налаштування груп розширень і програм, розміщених на корпоративних серверах, – включити сайт, на якому розміщено пакети CRX у правило ExtensionInstallSources і розмістити прямі посилання для завантаження в пакети на веб-сторінці. Панель запуску для веб-сторінки можна створити за допомогою правила ExtensionInstallForcelist. @@ -4017,6 +4046,7 @@ Якщо для цього правила вибрано значення false або його не налаштовано, функції веб-компонентів версії v0 буде вимкнено за умовчанням у M80 і новіших версіях. Це правило буде вилучено у версіях після Chrome 84. +За умовчанням документи можуть включатися в кластери агентів із ключем джерела. Метод доступу document.domain для таких документів не можна налаштувати. Повідомляти дані VPD пристрою. Якщо для цього правила вибрано значення false або його не налаштовано, інформація не надсилатиметься. @@ -4792,6 +4822,7 @@ Щоб указати хеш , об'єднайте назву алгоритму хешу, скісну риску та кодування Base64 алгоритму хешу, що застосовується до даних зазначеного сертифіката з DER-кодуванням. Кодування Base64 має той самий формат, що й відбиток SPKI. Розпізнається лише алгоритм хешу sha256. Усі інші ігноруються. Якщо не налаштувати це правило, не довірятиме нерозголошеним сертифікатам, дані яких мають бути розкриті внаслідок перевірки. +Увімкнути відкладене завантаження WebUI для екрана входу. Це правило більше не підтримується та буде замінене правилом AdvancedProtectionAllowed. Воно дає змогу вибрати, чи може користувач, який зареєструвався в Програмі додаткового захисту, надсилати свої завантаження в Google для перевірки на наявність зловмисного програмного забезпечення. Якщо для цього правила вибрано значення true або його не налаштовано, користувачу буде запропоновано надіслати свої файли в Google для ретельної перевірки. Якщо користувач натисне "Сканувати", його завантаження буде надіслано в Google. Якщо для цього правила вибрано значення false, користувачі не бачитимуть такого запиту, а їхні файли не надсилатимуться в Google. @@ -6521,6 +6552,11 @@ У ця функція доступна лише для машин із Windows 10 Pro, зареєстрованих у домені чи сервісі . У ця функція доступна лише для машин, які контролюються через Керування мобільними пристроями або зареєстровані в домені через MCX. Увімкнути центр спільного доступу +Якщо ввімкнути або не налаштувати це правило, зможе додатково зменшувати ризики, блокуючи точки застарілих розширень у процесі веб-переглядача. + + Якщо його вимкнути, це може мати негативний вплив на безпеку та стабільність , оскільки в процесі веб-переглядача в зможуть завантажуватися невідомі й потенційно шкідливі коди. Це правило можна вимикати, лише якщо виникають проблеми із сумісністю ПЗ незалежних розробників, яке потрібно запускати в процесі веб-переглядача в . + + Примітка: докладніше про правила зменшення ризиків для процесів можна прочитати на сторінці https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies. Цільова версія автоматичного оновлення U2F (універсальний другий фактор) Якщо це правило ввімкнено, хост віддаленого доступу порівнює ім'я локального користувача (з яким пов'язано хост) з назвою облікового запису Google, зареєстрованого як власник хосту (наприклад, "ivantkach", коли хост належить обліковому запису ivantkach@example.com). Якщо ім'я локального користувача відрізняється від імені власника, хост не запускається. Щоб пов'язати обліковий запис Google власника хосту з певним доменом, це правило потрібно застосовувати разом із правилом . @@ -6788,6 +6824,7 @@ Білий список серверів автентифікації Налаштування каталогу кешу на диску На початок +За умовчанням дозволяє кластеризацію агентів за ключем джерела. Параметри за умовчанням Додатки Chrome не підтримуються в ОС Windows, Mac і Linux. Якщо це правило ввімкнути, дозволятиме запускати додатки Chrome на цих платформах до дати завершення їх підтримки на всіх платформах (червень 2022 року). diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index b3811433857c6d..2f618427c0a7bc 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb @@ -178,6 +178,7 @@ Để biết thông tin chi tiết về các mẫu hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị đối với chính sách này. Báo cáo thông tin về quạt +Tắt chế độ tải Lazy Login WebUI. Bật tính năng hỗ trợ cho Signed HTTP Exchange (SXG) Chỉ định xem thiết bị có phải khôi phục về phiên bản do đặt không nếu đã chạy phiên bản mới hơn. @@ -486,6 +487,12 @@ Nếu bạn tắt chính sách này, thì việc cuộn trang web đến các ph Nếu bạn đặt chính sách này thành True, thì Chrome sẽ phóng to cửa sổ đầu tiên trong lần chạy đầu. Nếu bạn đặt chính sách này thành False hoặc không đặt chính sách này, thì Chrome có thể phóng to cửa sổ đầu tiên, tùy thuộc vào kích thước màn hình. +Chính sách này cho phép phân nhóm tác nhân theo khoá nguồn gốc theo mặc định. + + Origin-Agent-Cluster: Tiêu đề HTTP kiểm soát việc một tài liệu sẽ được tách riêng trong cụm tác nhân theo khoá nguồn gốc hay trong cụm tác nhân theo khoá trang web. Việc này sẽ gây ra những vấn đề phức tạp về bảo mật vì một cụm tác nhân theo khoá gốc cho phép tách riêng tài liệu theo nguồn gốc. Hệ quả mà nhà phát triển thấy được từ việc này là họ không thể thiết lập trình truy cập document.domain được nữa. + + Khi không có tiêu đề Origin-Agent-Cluster: nào được thiết lập, hành vi mặc định trong M101 sẽ thay đổi từ chỗ theo khoá trang web sang theo khoá nguồn gốc. Nếu chính sách này đang bật hoặc không được thiết lập, thì trình duyệt sẽ làm theo chế độ mặc định mới này kể từ phiên bản đó trở đi. Nếu chính sách này đang tắt thì thay đổi này sẽ đảo ngược lại và những tài liệu không có tiêu đề Origin-Agent-Cluster: sẽ được gán vào các cụm tác nhân theo khoá trang web. Do đó, trình truy cập document.domain sẽ vẫn thiết lập được theo mặc định. Hành vi này giống với hành vi cũ. + Nếu bạn đặt chính sách này thành Tắt, sẽ tắt Wi-Fi và người dùng không thể thay đổi tùy chọn này. Nếu bạn đặt chính sách này thành Bật hoặc không đặt, thì người dùng có thể bật hoặc tắt Wi-Fi. @@ -635,6 +642,7 @@ Nếu bạn tắt chính sách này, thì việc cuộn trang web đến các ph Để biết thêm thông tin, vui lòng truy cập . Lưu ý: Tùy chọn cài đặt này sẽ ghi đè chính sách , nếu có. +Tải WebUI đăng nhập chỉ khi cần. Cho phép tất cả trang web lưu dữ liệu trên máy Việc đặt chính sách này sẽ chỉ định tỷ lệ phần trăm độ sáng màn hình, tắt các tính năng tự động điều chỉnh độ sáng. Độ sáng màn hình ban đầu sẽ thay đổi theo giá trị của chính sách nhưng người dùng có thể thay đổi giá trị này. @@ -718,6 +726,7 @@ Nếu bạn tắt chính sách này, thì việc cuộn trang web đến các ph Chính sách này là tùy chọn. Nếu không đặt, yêu cầu tìm kiếm tức thì sẽ được gửi bằng phương thức GET. Chính sách này chỉ được tuân theo nếu kích hoạt chính sách 'DefaultSearchProviderEnabled'. +Theo mặc định, tài liệu được xếp vào các cụm tác nhân theo khoá trang web. document.domain sẽ vẫn thiết lập được. Cho phép tự động phát nội dung nghe nhìn Cảnh báo: Phiên bản dự phòng TLS sẽ bị xóa khỏi sau phiên bản 52 (khoảng tháng 9 năm 2016) và chính sách này sẽ ngừng hoạt động ngay sau đó. @@ -1867,6 +1876,15 @@ Khi chính sách này được đặt thành false hoặc không được địn Cho phép Màn hình hợp nhất và chính sách này bật theo mặc định. Người dùng được phép xuất/nhập các vùng chứa Crostini qua giao diện người dùng Chế độ in PostScript +Chính sách này kiểm soát việc liệu phần WebUI của màn hình đăng nhập sẽ luôn tải khi khởi động hay chỉ tải trước khi xuất hiện. Chính sách này áp dụng cho màn hình đăng nhập. + + Nếu chính sách này đang bật thì phần WebUI của giao diện đăng nhập sẽ chỉ tải trước khi xuất hiện. Việc này sẽ đẩy nhanh quá trình đăng nhập. + + Nếu chính sách này đang tắt thì phần WebUI của màn hình đăng nhập sẽ luôn tải khi khởi động (hành vi cũ). + + Nếu bạn không thiết lập thì hành vi này sẽ chịu sự kiểm soát của tính năng kEnableLazyLoginWebUILoading. + + Chính sách này sẽ bị xoá sau khi kEnableLazyLoginWebUILoading hoàn tất quá trình ra mắt. Những chính sách này được đưa vào đây để dễ xóa. Cho phép người dùng sử dụng các ứng dụng Android từ những nguồn không tin cậy Cài đặt này đã bị xóa kể từ phiên bản 29. Phương thức được đề xuất để thiết lập bộ sưu tập tiện ích/ứng dụng được tổ chức lưu trữ là đưa trang web lưu trữ gói CRX vào ExtensionInstallSources và đặt liên kết tải xuống trực tiếp vào trong các gói trên trang web. Có thể tạo trình chạy cho trang web đó bằng chính sách ExtensionInstallForcelist. @@ -4024,6 +4042,7 @@ Nếu bạn đặt chính sách thành Tắt, thì s Nếu bạn đặt chính sách này thành False hoặc không đặt, thì các tính năng của Thành phần web phiên bản 0 sẽ tắt theo mặc định kể từ M80. Chính sách này sẽ bị xóa sau Chrome 84. +Theo mặc định, có thể tài liệu sẽ được phân vào các cụm tác nhân theo khoá nguồn gốc. document.domain sẽ không thiết lập được cho những tài liệu như vậy. Báo cáo thông tin về VPD của thiết bị. Nếu bạn đặt chính sách này thành false hoặc không đặt, thì thông tin sẽ không được báo cáo. @@ -4802,6 +4821,7 @@ web và Ứng dụng web tiến bộ. Hiện chỉ được hỗ trợ trên Hãy chỉ định hàm băm bằng cách liên kết tên thuật toán hàm băm, một dấu gạch chéo và phương thức mã hóa Base64 của thuật toán hàm băm đó, áp dụng cho được mã hóa theo DER (Quy tắc mã hóa phân biệt) của chứng chỉ đã chỉ định. Định dạng mã hóa Base64 trùng khớp với định dạng của Vân tay số SPKI. Thuật toán hàm băm duy nhất mà hệ thống nhận dạng được là sha256. Các thuật toán hàm băm khác đều bị bỏ qua. Không đặt chính sách này đồng nghĩa với việc nếu bạn không tiết lộ những chứng chỉ buộc phải tiết lộ thông qua Tính minh bạch của chứng chỉ, thì sẽ không tin cậy những chứng chỉ đó. +Bật chế độ tải Lazy Login WebUI. Chính sách này không còn dùng nữa và đã được thay thế bằng AdvancedProtectionAllowed. Chính sách này kiểm soát liệu người dùng đăng ký chương trình Bảo vệ nâng cao có được phép gửi các tệp đã tải xuống cho Google để quét tìm phần mềm độc hại hay không. Nếu bạn không đặt hoặc đặt thành True, thì người dùng đã đăng ký sẽ được nhắc gửi các tệp của họ cho Google để quét sâu. Nếu người dùng chọn 'Quét' thì tệp họ đã tải xuống sẽ được gửi cho Google. Nếu bạn đặt thành False, thì người dùng sẽ không được nhắc và các tệp họ đã tải xuống sẽ không được gửi cho Google. @@ -6536,6 +6556,11 @@ Bạn nên định cấu hình chính sách trên Windows qua GPO, mặc dù vi Trên , chức năng này chỉ có ở những phiên bản liên kết với một miền , chạy trên Windows 10 Pro hoặc đã đăng ký . Trên , chức năng này chỉ có ở những phiên bản được quản lý qua MDM hoặc liên kết với một miền qua MCX. Bật trung tâm chia sẻ máy tính +Nếu bạn bật hoặc không thiết lập chính sách này thì sẽ được phép áp dụng chính sách giảm thiểu quy trình bảo mật cho các điểm mở rộng bổ sung để chặn các điểm mở rộng cũ trong quá trình xử lý trình duyệt. + + Khi bạn tắt chính sách này, thì tính bảo mật và độ ổn định của sẽ bị ảnh hưởng vì mã không xác định và có khả năng gây hại có thể được phép tải trong quá trình chạy trình duyệt của . Bạn chỉ nên tắt chính sách này nếu gặp vấn đề về khả năng tương thích với phần mềm bên thứ ba. Phần mềm này phải hoạt động trong quá trình chạy trình duyệt của . + + Lưu ý: Hãy đọc thêm về Chính sách giảm thiểu quy trình (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies). Phiên bản cập nhật tự động đích U2F (Hai yếu tố chung) Nếu bạn đặt chính sách này thành Bật, máy chủ truy cập từ xa sẽ so sánh tên của người dùng trên máy được liên kết với máy chủ và tên của Tài khoản Google được đăng ký làm chủ sở hữu máy chủ ("johndoe", nếu máy chủ thuộc sở hữu của "johndoe@example.com"). Máy chủ này sẽ không bắt đầu nếu tên của chủ sở hữu máy chủ khác với tên của người dùng trên máy được liên kết với máy chủ. Để đảm bảo rằng Tài khoản Google của chủ sở hữu được liên kết với một miền cụ thể, hãy sử dụng chính sách này với . @@ -6806,6 +6831,7 @@ Bạn nên định cấu hình chính sách trên Windows qua GPO, mặc dù vi Danh sách cho phép máy chủ xác thực Thiết lập thư mục bộ nhớ đệm trên đĩa Quay lại đầu trang +Cho phép phân nhóm tác nhân theo khoá nguồn gốc theo mặc định. Cấu hình mặc định Ứng dụng Chrome không được dùng nữa trên Windows, Mac và Linux. Nếu bạn bật chính sách này, thì sẽ tiếp tục cho phép Ứng dụng Chrome chạy trên các nền tảng này cho đến ngày cuối cùng, là thời điểm mà Ứng dụng Chrome không còn được hỗ trợ trên tất cả nền tảng vào tháng 6 năm 2022. diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.cc b/components/safe_browsing/core/common/safe_browsing_prefs.cc index 63da327d316d4c..bacfcd99cfa8be 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.cc +++ b/components/safe_browsing/core/common/safe_browsing_prefs.cc @@ -107,6 +107,8 @@ const char kSafeBrowsingMetricsLastLogTime[] = const char kSafeBrowsingEventTimestamps[] = "safebrowsing.event_timestamps"; const char kAccountTailoredSecurityUpdateTimestamp[] = "safebrowsing.aesb_update_time_windows_epoch_micros"; +const char kAccountTailoredSecurityShownNotification[] = + "safebrowsing.aesb_shown_notification"; const char kEnhancedProtectionEnabledViaTailoredSecurity[] = "safebrowsing.esb_enabled_via_tailored_security"; @@ -224,6 +226,8 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterTimePref( prefs::kAccountTailoredSecurityUpdateTimestamp, base::Time(), user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF); + registry->RegisterBooleanPref( + prefs::kAccountTailoredSecurityShownNotification, false); registry->RegisterBooleanPref( prefs::kEnhancedProtectionEnabledViaTailoredSecurity, false); } diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.h b/components/safe_browsing/core/common/safe_browsing_prefs.h index c4b2d87735f1f4..c72b92ad774e2e 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.h +++ b/components/safe_browsing/core/common/safe_browsing_prefs.h @@ -115,6 +115,10 @@ extern const char kSafeBrowsingEventTimestamps[]; // was updated. extern const char kAccountTailoredSecurityUpdateTimestamp[]; +// Whether the user was shown the notification that they may want to enable +// Enhanced Safe Browsing due to their account tailored security state. +extern const char kAccountTailoredSecurityShownNotification[]; + // A boolean indicating if Enhanced Protection was enabled in sync with // account tailored security. extern const char kEnhancedProtectionEnabledViaTailoredSecurity[]; diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index bb6da47c6f72f0..1b1e6e73a33e97 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb @@ -1554,7 +1554,7 @@ Ο ιστότοπος εμφανίζει παρεμβατικές ή παραπλανητικές διαφημίσεις Troy Άνοιγμα -Δεν είναι δυνατή η εγγραφή με λογαριασμό καταναλωτή (διατίθεται σχετική άδεια). +Δεν είναι δυνατή η εγγραφή με λογαριασμό προσωπικής χρήσης (διατίθεται σχετική άδεια). Ενότητα Επεξεργασία στοιχείων επικοινωνίας Κατάργηση από το ιστορικό diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 6e12bc608e8f8d..a95d9fc283334f 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb @@ -2287,6 +2287,7 @@ Détails supplémentaires : La politique de l'administrateur bloque le partage de vers Rechercher votre téléphone Gérez les données que vous synchronisez dans les paramètres de Chrome +Cœur Modules de traitement des paiements Plantages () Vous devez entrer deux fois la même phrase de passe. diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc index 5ae5ff22a13321..c4749bd9bb5583 100644 --- a/components/viz/service/display/surface_aggregator.cc +++ b/components/viz/service/display/surface_aggregator.cc @@ -255,6 +255,27 @@ gfx::Rect ComputeDrawableRectForQuad(const DrawQuad* quad) { return drawable_rect; } +// This function transforms a rect from its target space to the destination +// root target space. If clip_rect is valid, clipping is applied after +// transform. +gfx::Rect TransformRectToDestRootTargetSpace( + const gfx::Rect& rect_in_target_space, + const gfx::Transform& target_to_dest_transform, + const gfx::Transform& dest_to_root_target_transform, + const absl::optional& dest_root_target_clip_rect) { + gfx::Transform target_to_dest_root_target_transform = + gfx::Transform(dest_to_root_target_transform, target_to_dest_transform); + + gfx::Rect rect_in_root_target_space = cc::MathUtil::MapEnclosingClippedRect( + target_to_dest_root_target_transform, rect_in_target_space); + + if (dest_root_target_clip_rect) { + rect_in_root_target_space.Intersect(*dest_root_target_clip_rect); + } + + return rect_in_root_target_space; +} + } // namespace constexpr base::TimeDelta SurfaceAggregator::kHistogramMinTime; @@ -348,6 +369,7 @@ gfx::Rect SurfaceAggregator::DamageRectForSurface( // This function is called at each render pass - CopyQuadsToPass(). void SurfaceAggregator::AddRenderPassFilterDamageToDamageList( const gfx::Transform& parent_target_transform, + const absl::optional& dest_root_target_clip_rect, const CompositorRenderPass* source_pass, AggregatedRenderPass* dest_pass) { // Add damages from render passes with pixel-moving foreground filters or @@ -378,14 +400,16 @@ void SurfaceAggregator::AddRenderPassFilterDamageToDamageList( if (damage_rect_in_root_target_space.Intersects(root_damage_rect_)) { // Transform will be performed again in AddSurfaceDamageToDamageList() // Just pass in damage_rect instead of damage_rect_in_root_target_space. - AddSurfaceDamageToDamageList(damage_rect, gfx::Transform(), {}, dest_pass, + AddSurfaceDamageToDamageList(damage_rect, parent_target_transform, + dest_root_target_clip_rect, dest_pass, /*resolved_frame=*/nullptr); } } + void SurfaceAggregator::AddSurfaceDamageToDamageList( const gfx::Rect& default_damage_rect, const gfx::Transform& parent_target_transform, - const absl::optional& clip_rect, + const absl::optional& dest_root_target_clip_rect, AggregatedRenderPass* dest_pass, const ResolvedFrameData* resolved_frame) { gfx::Rect damage_rect; @@ -407,18 +431,10 @@ void SurfaceAggregator::AddSurfaceDamageToDamageList( } current_zero_damage_rect_is_not_recorded_ = false; - gfx::Transform parent_to_root_target_transform = gfx::Transform( - dest_pass->transform_to_root_target, parent_target_transform); - gfx::Rect damage_rect_in_root_target_space = - cc::MathUtil::MapEnclosingClippedRect(parent_to_root_target_transform, - damage_rect); - - if (clip_rect) { - gfx::Rect root_clip_rect = cc::MathUtil::MapEnclosingClippedRect( - dest_pass->transform_to_root_target, *clip_rect); - damage_rect_in_root_target_space.Intersect(root_clip_rect); - } + TransformRectToDestRootTargetSpace( + /*rect_in_target_space=*/damage_rect, parent_target_transform, + dest_pass->transform_to_root_target, dest_root_target_clip_rect); surface_damage_rect_list_->push_back(damage_rect_in_root_target_space); } @@ -433,7 +449,6 @@ const DrawQuad* SurfaceAggregator::FindQuadWithOverlayDamage( AggregatedRenderPass* dest_pass, const gfx::Transform& parent_target_transform, const Surface* surface, - const absl::optional& clip_rect, size_t* overlay_damage_index) { // If we have damage from a surface animation, then we shouldn't have an // overlay candidate from the root render pass, since that's an interpolated @@ -578,6 +593,7 @@ void SurfaceAggregator::HandleSurfaceQuad( float parent_device_scale_factor, const gfx::Transform& target_transform, const absl::optional& added_clip_rect, + const absl::optional& dest_root_target_clip_rect, AggregatedRenderPass* dest_pass, bool ignore_undamaged, gfx::Rect* damage_rect_in_quad_space, @@ -597,16 +613,30 @@ void SurfaceAggregator::HandleSurfaceQuad( // If a new surface is going to be emitted, add the surface_quad rect to // |surface_damage_rect_list_| for overlays. The whole quad is considered // damaged. - if (needs_surface_damage_rect_list_ && - (!resolved_frame || - (resolved_frame->surface_id() != primary_surface_id))) { - // If using a fallback surface the surface content may be stretched or have - // gutter. If the surface is missing the content will be filled with a solid - // color. In both cases we no longer have frame-to-frame damage so treat the - // entire SurfaceDrawQuad visible_rect as damaged. - AddSurfaceDamageToDamageList(ComputeDrawableRectForQuad(surface_quad), - target_transform, surface_clip_rect, dest_pass, - /*resolved_frame=*/nullptr); + absl::optional combined_clip_rect; + if (needs_surface_damage_rect_list_) { + gfx::Rect surface_in_target_space = + ComputeDrawableRectForQuad(surface_quad); + surface_in_target_space.Intersect(source_pass.output_rect); + + if (!resolved_frame || resolved_frame->surface_id() != primary_surface_id) { + // If using a fallback surface the surface content may be stretched or + // have gutter. If the surface is missing the content will be filled + // with a solid color. In both cases we no longer have frame-to-frame + // damage so treat the entire SurfaceDrawQuad visible_rect as damaged. + // |combined_clip_rect| is the transforming and clipping result of the + // entire SurfaceDrawQuad visible_rect on the root target space of the + // root surface. + AddSurfaceDamageToDamageList(surface_in_target_space, target_transform, + dest_root_target_clip_rect, dest_pass, + /*resolved_frame=*/nullptr); + } + + // combined_clip_rect is the result of |dest_root_target_clip_rect| + // intersecting |surface_quad| on the root target space of the root surface. + combined_clip_rect = TransformRectToDestRootTargetSpace( + /*rect_in_target_space=*/surface_in_target_space, target_transform, + dest_pass->transform_to_root_target, dest_root_target_clip_rect); } // If there's no fallback surface ID available, then simply emit a @@ -641,8 +671,8 @@ void SurfaceAggregator::HandleSurfaceQuad( } EmitSurfaceContent(*resolved_frame, parent_device_scale_factor, surface_quad, - target_transform, surface_clip_rect, dest_pass, - ignore_undamaged, damage_rect_in_quad_space, + target_transform, surface_clip_rect, combined_clip_rect, + dest_pass, ignore_undamaged, damage_rect_in_quad_space, damage_rect_in_quad_space_valid, mask_filter_info); } @@ -652,6 +682,7 @@ void SurfaceAggregator::EmitSurfaceContent( const SurfaceDrawQuad* surface_quad, const gfx::Transform& target_transform, const absl::optional& added_clip_rect, + const absl::optional& dest_root_target_clip_rect, AggregatedRenderPass* dest_pass, bool ignore_undamaged, gfx::Rect* damage_rect_in_quad_space, @@ -746,7 +777,7 @@ void SurfaceAggregator::EmitSurfaceContent( mask_filter_info.CanMergeMaskFilterInfo(*render_pass_list.back()); absl::optional surface_quad_clip; - if (merge_pass || needs_surface_damage_rect_list_) { + if (merge_pass) { // Compute a clip rect in |dest_pass| coordinate space to ensure merged // surface cannot draw outside where a non-merged surface would draw. An // enclosing rect in |surface_quad| target render pass coordinate space is @@ -758,9 +789,9 @@ void SurfaceAggregator::EmitSurfaceContent( } if (needs_surface_damage_rect_list_) { - AddSurfaceDamageToDamageList(/*default_damage_rect=*/gfx::Rect(), - combined_transform, surface_quad_clip, - dest_pass, &resolved_frame); + AddSurfaceDamageToDamageList( + /*default_damage_rect =*/gfx::Rect(), combined_transform, + dest_root_target_clip_rect, dest_pass, &resolved_frame); } if (frame.metadata.delegated_ink_metadata) { @@ -813,8 +844,8 @@ void SurfaceAggregator::EmitSurfaceContent( dest_pass->transform_to_root_target); CopyQuadsToPass(resolved_frame, resolved_pass, copy_pass.get(), - frame.device_scale_factor(), gfx::Transform(), {}, surface, - MaskFilterInfoExt()); + frame.device_scale_factor(), gfx::Transform(), {}, + dest_root_target_clip_rect, surface, MaskFilterInfoExt()); // If the render pass has copy requests, or should be cached, or has // moving-pixel filters, or in a moving-pixel surface, we should damage the @@ -840,7 +871,8 @@ void SurfaceAggregator::EmitSurfaceContent( if (merge_pass) { CopyQuadsToPass(resolved_frame, resolved_root_pass, dest_pass, frame.device_scale_factor(), combined_transform, - surface_quad_clip, surface, mask_filter_info); + surface_quad_clip, dest_root_target_clip_rect, surface, + mask_filter_info); } else { auto* shared_quad_state = CopyAndScaleSharedQuadState( surface_quad_sqs, scaled_quad_to_target_transform, target_transform, @@ -1102,6 +1134,7 @@ void SurfaceAggregator::CopyQuadsToPass( float parent_device_scale_factor, const gfx::Transform& target_transform, const absl::optional& clip_rect, + const absl::optional& dest_root_target_clip_rect, const Surface* surface, const MaskFilterInfoExt& parent_mask_filter_info_ext) { const CompositorRenderPass& source_pass = resolved_pass.render_pass(); @@ -1153,11 +1186,11 @@ void SurfaceAggregator::CopyQuadsToPass( size_t overlay_damage_index = 0; const DrawQuad* quad_with_overlay_damage_index = nullptr; if (needs_surface_damage_rect_list_) { - AddRenderPassFilterDamageToDamageList(target_transform, &source_pass, - dest_pass); + AddRenderPassFilterDamageToDamageList( + target_transform, dest_root_target_clip_rect, &source_pass, dest_pass); quad_with_overlay_damage_index = FindQuadWithOverlayDamage(source_pass, dest_pass, target_transform, - surface, clip_rect, &overlay_damage_index); + surface, &overlay_damage_index); } MaskFilterInfoExt new_mask_filter_info_ext = parent_mask_filter_info_ext; @@ -1188,8 +1221,8 @@ void SurfaceAggregator::CopyQuadsToPass( } HandleSurfaceQuad(source_pass, surface_quad, parent_device_scale_factor, - target_transform, clip_rect, dest_pass, - ignore_undamaged, &damage_rect_in_quad_space, + target_transform, clip_rect, dest_root_target_clip_rect, + dest_pass, ignore_undamaged, &damage_rect_in_quad_space, &damage_rect_in_quad_space_valid, new_mask_filter_info_ext); } else { @@ -1214,7 +1247,8 @@ void SurfaceAggregator::CopyQuadsToPass( dest_shared_quad_state->overlay_damage_index = surface_damage_rect_list_->size(); AddSurfaceDamageToDamageList(damage_rect_in_target_space.value(), - target_transform, clip_rect, dest_pass, + target_transform, + dest_root_target_clip_rect, dest_pass, /*resolved_frame=*/nullptr); } else if (quad == quad_with_overlay_damage_index) { dest_shared_quad_state->overlay_damage_index = overlay_damage_index; @@ -1352,15 +1386,18 @@ void SurfaceAggregator::CopyPasses(const ResolvedFrameData& resolved_frame) { if (needs_surface_damage_rect_list_ && resolved_pass.is_root()) { AddSurfaceDamageToDamageList( - /*default_damage_rect=*/gfx::Rect(), surface_transform, - /*clip_rect=*/{}, copy_pass.get(), &resolved_frame); + /*default_damage_rect=*/gfx::Rect(), + /*parent_target_transform=*/surface_transform, + /*dest_root_target_clip_rect=*/{}, /*dest_pass=*/copy_pass.get(), + &resolved_frame); } CopyQuadsToPass(resolved_frame, resolved_pass, copy_pass.get(), frame.device_scale_factor(), apply_surface_transform_to_root_pass ? surface_transform : gfx::Transform(), - {}, surface, MaskFilterInfoExt()); + {}, /*dest_root_target_clip_rect=*/{}, surface, + MaskFilterInfoExt()); // If the render pass has copy requests, or should be cached, or has // moving-pixel filters, or in a moving-pixel surface, we should damage the diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h index 5a2475ec9b1427..f8f03779e0592d 100644 --- a/components/viz/service/display/surface_aggregator.h +++ b/components/viz/service/display/surface_aggregator.h @@ -133,27 +133,35 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { // |source_pass| to |dest_pass|. // - |added_clip_rect| is an added clip rect in the |dest_pass| coordinate // space. - void HandleSurfaceQuad(const CompositorRenderPass& source_pass, - const SurfaceDrawQuad* surface_quad, - float parent_device_scale_factor, - const gfx::Transform& target_transform, - const absl::optional& added_clip_rect, - AggregatedRenderPass* dest_pass, - bool ignore_undamaged, - gfx::Rect* damage_rect_in_quad_space, - bool* damage_rect_in_quad_space_valid, - const MaskFilterInfoExt& mask_filter_info_pair); - - void EmitSurfaceContent(const ResolvedFrameData& resolved_frame, - float parent_device_scale_factor, - const SurfaceDrawQuad* surface_quad, - const gfx::Transform& target_transform, - const absl::optional& added_clip_rect, - AggregatedRenderPass* dest_pass, - bool ignore_undamaged, - gfx::Rect* damage_rect_in_quad_space, - bool* damage_rect_in_quad_space_valid, - const MaskFilterInfoExt& mask_filter_info_pair); + // - |dest_root_target_clip_rect| is on the root render pass space of the root + // surface, the same coordinate space as |root_damage_rect_|. This is only + // used for SurfaceDamageRectList computation and should not be used for + // Clipping quads. + void HandleSurfaceQuad( + const CompositorRenderPass& source_pass, + const SurfaceDrawQuad* surface_quad, + float parent_device_scale_factor, + const gfx::Transform& target_transform, + const absl::optional& added_clip_rect, + const absl::optional& dest_root_target_clip_rect, + AggregatedRenderPass* dest_pass, + bool ignore_undamaged, + gfx::Rect* damage_rect_in_quad_space, + bool* damage_rect_in_quad_space_valid, + const MaskFilterInfoExt& mask_filter_info_pair); + + void EmitSurfaceContent( + const ResolvedFrameData& resolved_frame, + float parent_device_scale_factor, + const SurfaceDrawQuad* surface_quad, + const gfx::Transform& target_transform, + const absl::optional& added_clip_rect, + const absl::optional& dest_root_target_clip_rect, + AggregatedRenderPass* dest_pass, + bool ignore_undamaged, + gfx::Rect* damage_rect_in_quad_space, + bool* damage_rect_in_quad_space_valid, + const MaskFilterInfoExt& mask_filter_info_pair); void EmitDefaultBackgroundColorQuad( const SurfaceDrawQuad* surface_quad, @@ -172,14 +180,16 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { AggregatedRenderPass* dest_pass, const MaskFilterInfoExt& mask_filter_info_pair); - void CopyQuadsToPass(const ResolvedFrameData& resolved_frame, - const ResolvedPassData& resolved_pass, - AggregatedRenderPass* dest_pass, - float parent_device_scale_factor, - const gfx::Transform& target_transform, - const absl::optional& clip_rect, - const Surface* surface, - const MaskFilterInfoExt& mask_filter_info_pair); + void CopyQuadsToPass( + const ResolvedFrameData& resolved_frame, + const ResolvedPassData& resolved_pass, + AggregatedRenderPass* dest_pass, + float parent_device_scale_factor, + const gfx::Transform& target_transform, + const absl::optional& clip_rect, + const absl::optional& dest_root_target_clip_rect, + const Surface* surface, + const MaskFilterInfoExt& mask_filter_info_pair); // Recursively walks through the render pass and updates the // |intersects_damage_under| flag on all RenderPassDrawQuads(RPDQ). @@ -252,10 +262,13 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { gfx::Rect DamageRectForSurface(const ResolvedFrameData& resolved_frame, bool include_per_quad_damage) const; - // This function adds a damage rect to |surface_damage_rect_list_|. The damage - // rect will come from |resolved_frame| if provided otherwise + // This function adds a damage rect to |surface_damage_rect_list_|. The + // surface damage rect comes from |resolved_frame| if provided, otherwise // |default_damage_rect| will be used. // + // |dest_root_target_clip_rect| is on the root render pass space of the root + // surface, the same coordinate space as |root_damage_rect_|. + // // |surface_damage_rect_list_| is different from the |root_damage_rect_| which // is the union of all surface damages. This function records per-surface // damage rects to |surface_damage_rect_list_| in a top-to-bottom order and is @@ -263,12 +276,13 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { void AddSurfaceDamageToDamageList( const gfx::Rect& default_damage_rect, const gfx::Transform& parent_target_transform, - const absl::optional& clip_rect, + const absl::optional& dest_root_target_clip_rect, AggregatedRenderPass* dest_pass, const ResolvedFrameData* resolved_frame); void AddRenderPassFilterDamageToDamageList( const gfx::Transform& parent_target_transform, + const absl::optional& dest_root_target_clip_rect, const CompositorRenderPass* source_pass, AggregatedRenderPass* dest_pass); @@ -278,7 +292,6 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { AggregatedRenderPass* dest_pass, const gfx::Transform& parent_target_transform, const Surface* surface, - const absl::optional& clip_rect, size_t* overlay_damage_index); bool IsRootSurface(const Surface* surface) const; diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 3580332b7615fc..df1d44ed370126 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -1233,15 +1233,6 @@ uint32_t RenderWidgetHostViewAndroid::GetCaptureSequenceNumber() const { return latest_capture_sequence_number_; } -void RenderWidgetHostViewAndroid::OnInterstitialPageAttached() { - if (view_.parent()) - view_.parent()->MoveToFront(&view_); -} - -void RenderWidgetHostViewAndroid::OnInterstitialPageGoingAway() { - ResetSynchronousCompositor(); -} - bool RenderWidgetHostViewAndroid::CanSynchronizeVisualProperties() { // When a rotation begins, the new visual properties are not all notified to // RenderWidgetHostViewAndroid at the same time. The process begins when diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 85e96b85630d29..2954ba17d851ba 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -174,8 +174,6 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid bool IsInVR() const override; void DidOverscroll(const ui::DidOverscrollParams& params) override; void DidStopFlinging() override; - void OnInterstitialPageAttached() override; - void OnInterstitialPageGoingAway() override; bool CanSynchronizeVisualProperties() override; std::unique_ptr CreateSyntheticGestureTarget() override; diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index e15b08a576e276..0c21c3b6e2a4b7 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -347,15 +347,6 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView { // Returns true if this view's size have been initialized. virtual bool HasSize() const; - // Informs the view that the assocaited InterstitialPage was attached. - virtual void OnInterstitialPageAttached() {} - - // Tells the view that the assocaited InterstitialPage will going away (but is - // not yet destroyed, as InterstitialPage destruction is asynchronous). The - // view may use this notification to clean up associated resources. This - // should be called before the WebContents is fully destroyed. - virtual void OnInterstitialPageGoingAway() {} - // Returns true if the visual properties should be sent to the renderer at // this time. This function is intended for subclasses to suppress // synchronization, the default implementation returns true. diff --git a/device/bluetooth/chromeos/bluetooth_utils.cc b/device/bluetooth/chromeos/bluetooth_utils.cc index 02c5939c2d6b15..534430956fef32 100644 --- a/device/bluetooth/chromeos/bluetooth_utils.cc +++ b/device/bluetooth/chromeos/bluetooth_utils.cc @@ -15,6 +15,7 @@ #include "base/strings/string_util.h" #include "base/time/time.h" #include "chromeos/constants/chromeos_features.h" +#include "device/bluetooth/floss/floss_features.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "device/base/features.h" @@ -160,6 +161,12 @@ device::BluetoothAdapter::DeviceList FilterBluetoothDeviceList( } bool IsUnsupportedDevice(const device::BluetoothDevice* device) { + // With Floss, device list filtering is still unstable. We disable filtering + // first so that Floss testing of other features can be unblocked. + // TODO(b/202335393): Enable device filtering once it's stable with Floss. + if (base::FeatureList::IsEnabled(floss::features::kFlossEnabled)) + return false; + #if BUILDFLAG(IS_CHROMEOS_ASH) if (chromeos::switches::IsUnfilteredBluetoothDevicesEnabled()) return false; diff --git a/extensions/browser/api/feedback_private/feedback_service.cc b/extensions/browser/api/feedback_private/feedback_service.cc index 4bff145bc3c92a..a5a055cf507c1d 100644 --- a/extensions/browser/api/feedback_private/feedback_service.cc +++ b/extensions/browser/api/feedback_private/feedback_service.cc @@ -13,6 +13,7 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" #include "base/metrics/statistics_recorder.h" #include "base/time/time.h" #include "build/chromeos_buildflags.h" @@ -152,6 +153,9 @@ void FeedbackService::OnAttachedFileAndScreenshotFetched( // True means report will be sent shortly. // False means report will be sent once the device is online. const bool status = !net::NetworkChangeNotifier::IsOffline(); + + UMA_HISTOGRAM_BOOLEAN("Feedback.ReportSending.Online", status); + // Notify client that data submitted has been received successfully. The // report will be sent out once further processing is done. std::move(callback).Run(status); diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn index 361e9bebea9732..19d2193e215374 100644 --- a/fuchsia/engine/BUILD.gn +++ b/fuchsia/engine/BUILD.gn @@ -83,7 +83,6 @@ foreach(locale, locales_with_pseudolocales) { component("web_engine_core") { deps = [ - ":audio_device_factory", ":fidl", ":switches", "//base", @@ -123,12 +122,12 @@ component("web_engine_core") { "//fuchsia/base:legacymetrics", "//fuchsia/base:message_port", "//fuchsia/base:modular", + "//fuchsia/engine/mojom", "//fuchsia/engine/web_instance_host", "//google_apis", "//gpu/command_buffer/service", "//media", "//media/fuchsia/cdm/service", - "//media/fuchsia/mojom", "//media/fuchsia/mojom:cdm_provider", "//media/mojo/common", "//media/mojo/services", @@ -138,6 +137,7 @@ component("web_engine_core") { "//services/network/public/mojom", "//skia", "//skia/public/mojom", + "//third_party/blink/public:blink", "//third_party/blink/public/common", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.accessibility.semantics", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.feedback", @@ -209,8 +209,6 @@ component("web_engine_core") { "browser/frame_permission_controller.h", "browser/frame_window_tree_host.cc", "browser/frame_window_tree_host.h", - "browser/fuchsia_media_resource_provider_impl.cc", - "browser/fuchsia_media_resource_provider_impl.h", "browser/media_player_impl.cc", "browser/media_player_impl.h", "browser/navigation_controller_impl.cc", @@ -237,6 +235,8 @@ component("web_engine_core") { "browser/web_engine_content_browser_client.h", "browser/web_engine_devtools_controller.cc", "browser/web_engine_devtools_controller.h", + "browser/web_engine_media_resource_provider_impl.cc", + "browser/web_engine_media_resource_provider_impl.h", "browser/web_engine_memory_inspector.cc", "browser/web_engine_memory_inspector.h", "browser/web_engine_net_log_observer.cc", @@ -253,6 +253,8 @@ component("web_engine_core") { "context_provider_impl.h", "context_provider_main.cc", "context_provider_main.h", + "renderer/web_engine_audio_device_factory.cc", + "renderer/web_engine_audio_device_factory.h", "renderer/web_engine_audio_renderer.cc", "renderer/web_engine_audio_renderer.h", "renderer/web_engine_content_renderer_client.cc", @@ -270,26 +272,6 @@ component("web_engine_core") { visibility = [ ":*" ] } -source_set("audio_device_factory") { - sources = [ - "renderer/web_engine_audio_device_factory.cc", - "renderer/web_engine_audio_device_factory.h", - ] - - deps = [ - "//base", - "//content/public/renderer", - "//media", - "//media/fuchsia/mojom", - "//mojo/public/cpp/bindings", - "//third_party/blink/public:blink", - ] - - public_deps = [ "//third_party/blink/public/common" ] - - visibility = [ ":*" ] -} - # TODO(crbug.com/1081525): Rename to features_and_switches or collapse into # common. Consider moving these and other files in engine/ to common/ or # elsewhere. diff --git a/fuchsia/engine/browser/fuchsia_media_resource_provider_impl.h b/fuchsia/engine/browser/fuchsia_media_resource_provider_impl.h deleted file mode 100644 index fb23f17120f799..00000000000000 --- a/fuchsia/engine/browser/fuchsia_media_resource_provider_impl.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FUCHSIA_ENGINE_BROWSER_FUCHSIA_MEDIA_RESOURCE_PROVIDER_IMPL_H_ -#define FUCHSIA_ENGINE_BROWSER_FUCHSIA_MEDIA_RESOURCE_PROVIDER_IMPL_H_ - -#include - -#include "content/public/browser/document_service.h" -#include "media/fuchsia/mojom/fuchsia_media_resource_provider.mojom.h" - -namespace content { -class RenderFrameHost; -} // namespace content - -class FuchsiaMediaResourceProviderImpl final - : public content::DocumentService< - media::mojom::FuchsiaMediaResourceProvider> { - public: - ~FuchsiaMediaResourceProviderImpl() override; - - FuchsiaMediaResourceProviderImpl(const FuchsiaMediaResourceProviderImpl&) = - delete; - FuchsiaMediaResourceProviderImpl& operator=( - const FuchsiaMediaResourceProviderImpl&) = delete; - FuchsiaMediaResourceProviderImpl(const FuchsiaMediaResourceProviderImpl&&) = - delete; - FuchsiaMediaResourceProviderImpl& operator=( - const FuchsiaMediaResourceProviderImpl&&) = delete; - - static void Bind( - content::RenderFrameHost* frame_host, - mojo::PendingReceiver - receiver); - - private: - FuchsiaMediaResourceProviderImpl( - content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver - receiver); - - // media::mojom::FuchsiaMediaResourceProvider: - void ShouldUseAudioConsumer(ShouldUseAudioConsumerCallback callback) override; - void CreateAudioConsumer( - fidl::InterfaceRequest request) override; - void CreateAudioCapturer( - fidl::InterfaceRequest request) override; -}; - -#endif // FUCHSIA_ENGINE_BROWSER_FUCHSIA_MEDIA_RESOURCE_PROVIDER_IMPL_H_ diff --git a/fuchsia/engine/browser/web_engine_browser_interface_binders.cc b/fuchsia/engine/browser/web_engine_browser_interface_binders.cc index 19792194868b0c..759ed38816b8b8 100644 --- a/fuchsia/engine/browser/web_engine_browser_interface_binders.cc +++ b/fuchsia/engine/browser/web_engine_browser_interface_binders.cc @@ -6,14 +6,14 @@ #include "fuchsia/engine/browser/cdm_provider_service.h" #include "fuchsia/engine/browser/frame_impl.h" -#include "fuchsia/engine/browser/fuchsia_media_resource_provider_impl.h" +#include "fuchsia/engine/browser/web_engine_media_resource_provider_impl.h" #include "mojo/public/cpp/bindings/pending_receiver.h" void PopulateFuchsiaFrameBinders( mojo::BinderMapWithContext* map, CdmProviderService* cdm_provider_service) { - map->Add( - base::BindRepeating(&FuchsiaMediaResourceProviderImpl::Bind)); + map->Add( + base::BindRepeating(&WebEngineMediaResourceProviderImpl::Bind)); map->Add(base::BindRepeating( &CdmProviderService::Bind, base::Unretained(cdm_provider_service))); } diff --git a/fuchsia/engine/browser/fuchsia_media_resource_provider_impl.cc b/fuchsia/engine/browser/web_engine_media_resource_provider_impl.cc similarity index 80% rename from fuchsia/engine/browser/fuchsia_media_resource_provider_impl.cc rename to fuchsia/engine/browser/web_engine_media_resource_provider_impl.cc index 11cd2491337eb3..b61410b02b825d 100644 --- a/fuchsia/engine/browser/fuchsia_media_resource_provider_impl.cc +++ b/fuchsia/engine/browser/web_engine_media_resource_provider_impl.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "fuchsia/engine/browser/fuchsia_media_resource_provider_impl.h" +#include "fuchsia/engine/browser/web_engine_media_resource_provider_impl.h" #include #include @@ -17,29 +17,29 @@ #include "fuchsia/engine/browser/frame_impl.h" #include "media/base/media_switches.h" -void FuchsiaMediaResourceProviderImpl::Bind( +void WebEngineMediaResourceProviderImpl::Bind( content::RenderFrameHost* frame_host, - mojo::PendingReceiver - receiver) { + mojo::PendingReceiver receiver) { // The object will delete itself when connection to the frame is broken. - new FuchsiaMediaResourceProviderImpl(frame_host, std::move(receiver)); + new WebEngineMediaResourceProviderImpl(frame_host, std::move(receiver)); } -FuchsiaMediaResourceProviderImpl::FuchsiaMediaResourceProviderImpl( +WebEngineMediaResourceProviderImpl::WebEngineMediaResourceProviderImpl( content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver receiver) + mojo::PendingReceiver receiver) : DocumentService(render_frame_host, std::move(receiver)) {} -FuchsiaMediaResourceProviderImpl::~FuchsiaMediaResourceProviderImpl() = default; +WebEngineMediaResourceProviderImpl::~WebEngineMediaResourceProviderImpl() = + default; -void FuchsiaMediaResourceProviderImpl::ShouldUseAudioConsumer( +void WebEngineMediaResourceProviderImpl::ShouldUseAudioConsumer( ShouldUseAudioConsumerCallback callback) { auto* frame_impl = FrameImpl::FromRenderFrameHost(render_frame_host()); DCHECK(frame_impl); std::move(callback).Run(frame_impl->media_session_id().has_value()); } -void FuchsiaMediaResourceProviderImpl::CreateAudioConsumer( +void WebEngineMediaResourceProviderImpl::CreateAudioConsumer( fidl::InterfaceRequest request) { if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableAudioOutput)) { @@ -65,7 +65,7 @@ void FuchsiaMediaResourceProviderImpl::CreateAudioConsumer( std::move(request)); } -void FuchsiaMediaResourceProviderImpl::CreateAudioCapturer( +void WebEngineMediaResourceProviderImpl::CreateAudioCapturer( fidl::InterfaceRequest request) { if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableAudioInput)) { diff --git a/fuchsia/engine/browser/web_engine_media_resource_provider_impl.h b/fuchsia/engine/browser/web_engine_media_resource_provider_impl.h new file mode 100644 index 00000000000000..c4a8fbe116e2fc --- /dev/null +++ b/fuchsia/engine/browser/web_engine_media_resource_provider_impl.h @@ -0,0 +1,48 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_MEDIA_RESOURCE_PROVIDER_IMPL_H_ +#define FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_MEDIA_RESOURCE_PROVIDER_IMPL_H_ + +#include + +#include "content/public/browser/document_service.h" +#include "fuchsia/engine/mojom/web_engine_media_resource_provider.mojom.h" + +namespace content { +class RenderFrameHost; +} // namespace content + +class WebEngineMediaResourceProviderImpl final + : public content::DocumentService { + public: + ~WebEngineMediaResourceProviderImpl() override; + + WebEngineMediaResourceProviderImpl( + const WebEngineMediaResourceProviderImpl&) = delete; + WebEngineMediaResourceProviderImpl& operator=( + const WebEngineMediaResourceProviderImpl&) = delete; + WebEngineMediaResourceProviderImpl( + const WebEngineMediaResourceProviderImpl&&) = delete; + WebEngineMediaResourceProviderImpl& operator=( + const WebEngineMediaResourceProviderImpl&&) = delete; + + static void Bind( + content::RenderFrameHost* frame_host, + mojo::PendingReceiver receiver); + + private: + WebEngineMediaResourceProviderImpl( + content::RenderFrameHost* render_frame_host, + mojo::PendingReceiver receiver); + + // mojom::WebEngineMediaResourceProvider: + void ShouldUseAudioConsumer(ShouldUseAudioConsumerCallback callback) override; + void CreateAudioConsumer( + fidl::InterfaceRequest request) override; + void CreateAudioCapturer( + fidl::InterfaceRequest request) override; +}; + +#endif // FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_MEDIA_RESOURCE_PROVIDER_IMPL_H_ diff --git a/fuchsia/engine/mojom/BUILD.gn b/fuchsia/engine/mojom/BUILD.gn new file mode 100644 index 00000000000000..ca4033c1b24ed4 --- /dev/null +++ b/fuchsia/engine/mojom/BUILD.gn @@ -0,0 +1,36 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//mojo/public/tools/bindings/mojom.gni") + +mojom("mojom") { + sources = [ "web_engine_media_resource_provider.mojom" ] + + export_class_attribute_blink = "BLINK_PLATFORM_EXPORT" + export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1" + export_header_blink = "third_party/blink/public/platform/web_common.h" + + shared_cpp_typemaps = { + types = [ + { + mojom = "mojom.AudioConsumerRequest" + cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioConsumer>" + move_only = true + }, + { + mojom = "mojom.AudioCapturerRequest" + cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioCapturer>" + move_only = true + }, + ] + traits_headers = [ "web_engine_media_resource_provider_mojom_traits.h" ] + traits_public_deps = [ + "//fuchsia/mojom:traits", + "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media", + ] + } + + cpp_typemaps = [ shared_cpp_typemaps ] + blink_cpp_typemaps = [ shared_cpp_typemaps ] +} diff --git a/fuchsia/engine/mojom/DEPS b/fuchsia/engine/mojom/DEPS new file mode 100644 index 00000000000000..31dab83e1d8c59 --- /dev/null +++ b/fuchsia/engine/mojom/DEPS @@ -0,0 +1,5 @@ +specific_include_rules = { + "web_engine_.*_provider_mojom_traits\.h": [ + "+fuchsia/mojom/fidl_interface_request_mojom_traits.h", + ], +} diff --git a/fuchsia/engine/mojom/OWNERS b/fuchsia/engine/mojom/OWNERS new file mode 100644 index 00000000000000..1feb514975033b --- /dev/null +++ b/fuchsia/engine/mojom/OWNERS @@ -0,0 +1,4 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS diff --git a/media/fuchsia/mojom/fuchsia_media_resource_provider.mojom b/fuchsia/engine/mojom/web_engine_media_resource_provider.mojom similarity index 94% rename from media/fuchsia/mojom/fuchsia_media_resource_provider.mojom rename to fuchsia/engine/mojom/web_engine_media_resource_provider.mojom index 95449dd3d6b2ad..ccd4f844d20996 100644 --- a/media/fuchsia/mojom/fuchsia_media_resource_provider.mojom +++ b/fuchsia/engine/mojom/web_engine_media_resource_provider.mojom @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -module media.mojom; +module mojom; // Mojo struct for fidl::InterfaceRequest. struct AudioConsumerRequest { @@ -16,7 +16,7 @@ struct AudioCapturerRequest { // Interface used by the render to create media resources. Instances are // document-scoped. -interface FuchsiaMediaResourceProvider { +interface WebEngineMediaResourceProvider { // Returns true if the frame should use AudioConsumer to render audio // streams. The call needs to be synchronous because `media::Renderer` needs // to be constructed synchronously. diff --git a/media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h b/fuchsia/engine/mojom/web_engine_media_resource_provider_mojom_traits.h similarity index 58% rename from media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h rename to fuchsia/engine/mojom/web_engine_media_resource_provider_mojom_traits.h index 29aa82a50490b4..7e6ee89f46b5c5 100644 --- a/media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h +++ b/fuchsia/engine/mojom/web_engine_media_resource_provider_mojom_traits.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_FUCHSIA_MOJOM_FUCHSIA_MEDIA_RESOURCE_PROVIDER_MOJOM_TRAITS_H_ -#define MEDIA_FUCHSIA_MOJOM_FUCHSIA_MEDIA_RESOURCE_PROVIDER_MOJOM_TRAITS_H_ +#ifndef FUCHSIA_ENGINE_MOJOM_WEB_ENGINE_MEDIA_RESOURCE_PROVIDER_MOJOM_TRAITS_H_ +#define FUCHSIA_ENGINE_MOJOM_WEB_ENGINE_MEDIA_RESOURCE_PROVIDER_MOJOM_TRAITS_H_ #include @@ -12,19 +12,19 @@ namespace mojo { template <> -struct StructTraits> : public FidlInterfaceRequestStructTraits< - media::mojom::AudioConsumerRequestDataView, + mojom::AudioConsumerRequestDataView, fuchsia::media::AudioConsumer> {}; template <> -struct StructTraits> : public FidlInterfaceRequestStructTraits< - media::mojom::AudioCapturerRequestDataView, + mojom::AudioCapturerRequestDataView, fuchsia::media::AudioCapturer> {}; } // namespace mojo -#endif // MEDIA_FUCHSIA_MOJOM_FUCHSIA_MEDIA_RESOURCE_PROVIDER_MOJOM_TRAITS_H_ +#endif // FUCHSIA_ENGINE_MOJOM_WEB_ENGINE_MEDIA_RESOURCE_PROVIDER_MOJOM_TRAITS_H_ diff --git a/fuchsia/engine/renderer/web_engine_audio_device_factory.cc b/fuchsia/engine/renderer/web_engine_audio_device_factory.cc index d624e2778a42ff..545f8c35f4cc40 100644 --- a/fuchsia/engine/renderer/web_engine_audio_device_factory.cc +++ b/fuchsia/engine/renderer/web_engine_audio_device_factory.cc @@ -8,11 +8,10 @@ #include "base/check.h" #include "content/public/renderer/render_frame.h" +#include "fuchsia/engine/mojom/web_engine_media_resource_provider.mojom.h" #include "media/base/audio_renderer_sink.h" #include "media/fuchsia/audio/fuchsia_audio_capturer_source.h" #include "media/fuchsia/audio/fuchsia_audio_output_device.h" -#include "media/fuchsia/mojom/fuchsia_media_resource_provider.mojom.h" -#include "media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" @@ -81,8 +80,7 @@ WebEngineAudioDeviceFactory::CreateAudioRendererSink( CHECK(render_frame); // Connect FuchsiaMediaResourceProvider. - mojo::Remote - media_resource_provider; + mojo::Remote media_resource_provider; render_frame->GetBrowserInterfaceBroker()->GetInterface( media_resource_provider.BindNewPipeAndPassReceiver()); @@ -122,9 +120,8 @@ WebEngineAudioDeviceFactory::CreateAudioCapturerSource( if (!render_frame) return nullptr; - // Connect FuchsiaMediaResourceProvider. - mojo::Remote - media_resource_provider; + // Connect WebEngineMediaResourceProvider. + mojo::Remote media_resource_provider; render_frame->GetBrowserInterfaceBroker()->GetInterface( media_resource_provider.BindNewPipeAndPassReceiver()); diff --git a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc index f06f33f91b1768..fafdada85a3eca 100644 --- a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc +++ b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc @@ -274,8 +274,7 @@ WebEngineContentRendererClient::GetBaseRendererFactory( get_gpu_factories_cb) { auto* interface_broker = render_frame->GetBrowserInterfaceBroker(); - mojo::Remote - media_resource_provider; + mojo::Remote media_resource_provider; interface_broker->GetInterface( media_resource_provider.BindNewPipeAndPassReceiver()); diff --git a/fuchsia/engine/renderer/web_engine_media_renderer_factory.cc b/fuchsia/engine/renderer/web_engine_media_renderer_factory.cc index 4b3b62c47432ce..63b065650e1689 100644 --- a/fuchsia/engine/renderer/web_engine_media_renderer_factory.cc +++ b/fuchsia/engine/renderer/web_engine_media_renderer_factory.cc @@ -20,8 +20,7 @@ WebEngineMediaRendererFactory::WebEngineMediaRendererFactory( media::MediaLog* media_log, media::DecoderFactory* decoder_factory, GetGpuFactoriesCB get_gpu_factories_cb, - mojo::Remote - media_resource_provider) + mojo::Remote media_resource_provider) : media_log_(media_log), decoder_factory_(decoder_factory), get_gpu_factories_cb_(std::move(get_gpu_factories_cb)), diff --git a/fuchsia/engine/renderer/web_engine_media_renderer_factory.h b/fuchsia/engine/renderer/web_engine_media_renderer_factory.h index 886a9f24f570c4..9a60ede55cec62 100644 --- a/fuchsia/engine/renderer/web_engine_media_renderer_factory.h +++ b/fuchsia/engine/renderer/web_engine_media_renderer_factory.h @@ -9,8 +9,8 @@ #include #include "base/callback.h" +#include "fuchsia/engine/mojom/web_engine_media_resource_provider.mojom.h" #include "media/base/renderer_factory.h" -#include "media/fuchsia/mojom/fuchsia_media_resource_provider.mojom.h" #include "mojo/public/cpp/bindings/remote.h" namespace media { @@ -33,7 +33,7 @@ class WebEngineMediaRendererFactory final : public media::RendererFactory { media::MediaLog* media_log, media::DecoderFactory* decoder_factory, GetGpuFactoriesCB get_gpu_factories_cb, - mojo::Remote + mojo::Remote media_resource_provider); ~WebEngineMediaRendererFactory() override; @@ -62,8 +62,7 @@ class WebEngineMediaRendererFactory final : public media::RendererFactory { // Creates factories for supporting video accelerators. May be null. GetGpuFactoriesCB get_gpu_factories_cb_; - mojo::Remote - media_resource_provider_; + mojo::Remote media_resource_provider_; }; #endif // FUCHSIA_ENGINE_RENDERER_WEB_ENGINE_MEDIA_RENDERER_FACTORY_H_ diff --git a/fuchsia/mojom/BUILD.gn b/fuchsia/mojom/BUILD.gn index aa624eda5838fa..ee569f07a5299a 100644 --- a/fuchsia/mojom/BUILD.gn +++ b/fuchsia/mojom/BUILD.gn @@ -43,6 +43,7 @@ source_set("traits") { visibility = [ ":*", + "//fuchsia/engine/mojom:*", "//media/fuchsia/mojom:*", ] } diff --git a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc index ef042792c7cb60..76dab7f579c5c8 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc @@ -5,6 +5,7 @@ #include "gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h" #include "base/logging.h" +#include "build/build_config.h" #include "components/viz/common/gpu/vulkan_context_provider.h" #include "components/viz/common/resources/resource_sizes.h" #include "gpu/command_buffer/common/shared_image_usage.h" @@ -13,6 +14,7 @@ #include "gpu/command_buffer/service/shared_image_backing_gl_common.h" #include "gpu/command_buffer/service/shared_image_backing_gl_image.h" #include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" #include "gpu/command_buffer/service/skia_utils.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_fence_helper.h" @@ -82,7 +84,7 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, bool Initialize( const SharedImageBackingFactoryAngleVulkan::FormatInfo& format_info, - const SharedImageBackingGLCommon::UnpackStateAttribs& attribs) { + const base::span& data) { auto* device_queue = context_state_->vk_context_provider()->GetDeviceQueue(); VkFormat vk_format = ToVkFormat(format()); @@ -120,6 +122,30 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, vulkan_image_ = std::move(vulkan_image); egl_image_ = std::move(egl_image); + + if (!data.empty()) { + size_t stride = BitsPerPixel(format()) / 8 * size().width(); + WritePixels(data, stride); + SetCleared(); + } + + return true; + } + + bool InitializeFromGMB( + const SharedImageBackingFactoryAngleVulkan::FormatInfo& format_info, + gfx::GpuMemoryBufferHandle handle) { + SharedMemoryRegionWrapper shared_memory_wrapper; + if (!shared_memory_wrapper.Initialize(handle, size(), format())) + return false; + + if (!Initialize(format_info, {})) + return false; + + shared_memory_wrapper_ = std::move(shared_memory_wrapper); + Update(nullptr); + SetCleared(); + return true; } @@ -131,7 +157,8 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, } void Update(std::unique_ptr in_fence) override { - NOTREACHED() << "Not supported."; + WritePixels(shared_memory_wrapper_.GetMemoryAsSpan(), + shared_memory_wrapper_.GetStride()); } void OnMemoryDump(const std::string& dump_name, @@ -250,6 +277,27 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, return true; } + bool WritePixels(const base::span& pixel_data, size_t stride) { + if (!BeginAccessSkia(/*readonly=*/false)) + return false; + + auto* gr_context = context_state_->gr_context(); + + auto info = SkImageInfo::Make(size().width(), size().height(), + ResourceFormatToClosestSkColorType( + /*gpu_compositing=*/true, format()), + kOpaque_SkAlphaType); + SkPixmap pixmap(info, pixel_data.data(), stride); + if (!gr_context->updateBackendTexture(backend_texture_, &pixmap, + /*numLevels=*/1, nullptr, nullptr)) { + DLOG(ERROR) << "updateBackendTexture() failed."; + } + + EndAccessSkia(); + + return true; + } + raw_ptr context_state_; std::unique_ptr vulkan_image_; scoped_refptr egl_image_; @@ -263,6 +311,7 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, kGLReadWrite, }; AccessMode access_mode_ = kNone; + SharedMemoryRegionWrapper shared_memory_wrapper_; }; // namespace class AngleVulkanBacking::SkiaRepresentation @@ -372,6 +421,7 @@ SharedImageBackingFactoryAngleVulkan::SharedImageBackingFactoryAngleVulkan( gpu_feature_info, context_state->progress_reporter()), context_state_(context_state) { + DCHECK(context_state_->GrContextIsVulkan()); DCHECK(gl::GLSurfaceEGL::IsANGLEVulkanImageSupported()); } @@ -399,7 +449,7 @@ SharedImageBackingFactoryAngleVulkan::CreateSharedImage( context_state_, mailbox, format, size, color_space, surface_origin, alpha_type, usage); - if (!result->Initialize(format_info, attribs_)) + if (!result->Initialize(format_info, {})) return nullptr; return result; } @@ -414,8 +464,19 @@ SharedImageBackingFactoryAngleVulkan::CreateSharedImage( SkAlphaType alpha_type, uint32_t usage, base::span data) { - NOTREACHED() << "Not supported"; - return nullptr; + const FormatInfo& format_info = format_info_[format]; + if (!CanCreateSharedImage(size, /*pixel_data=*/{}, format_info, + GL_TEXTURE_2D)) { + return nullptr; + } + + auto result = std::make_unique( + context_state_, mailbox, format, size, color_space, surface_origin, + alpha_type, usage); + + if (!result->Initialize(format_info, data)) + return nullptr; + return result; } std::unique_ptr @@ -431,17 +492,45 @@ SharedImageBackingFactoryAngleVulkan::CreateSharedImage( GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { - NOTREACHED() << "Not supported"; - return nullptr; + if (plane != gfx::BufferPlane::DEFAULT) { + LOG(DFATAL) << "Invalid plane"; + return nullptr; + } + + if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, buffer_format)) { + LOG(DFATAL) << "Invalid image size for format."; + return nullptr; + } + + auto format = viz::GetResourceFormat(buffer_format); + + const FormatInfo& format_info = format_info_[format]; + if (!CanCreateSharedImage(size, /*pixel_data=*/{}, format_info, + GL_TEXTURE_2D)) { + return nullptr; + } + + auto result = std::make_unique( + context_state_, mailbox, format, size, color_space, surface_origin, + alpha_type, usage); + + if (!result->InitializeFromGMB(format_info, std::move(handle))) + return nullptr; + + return result; } bool SharedImageBackingFactoryAngleVulkan::CanUseAngleVulkanBacking( - uint32_t usage, - GrContextType gr_context_type) const { + uint32_t usage) const { // Ignore for mipmap usage. usage &= ~SHARED_IMAGE_USAGE_MIPMAP; + // TODO(penghuang): verify the scanout is the right usage for video playback. + // crbug.com/1280798 constexpr auto kSupportedUsages = +#if defined(OS_LINUX) + SHARED_IMAGE_USAGE_SCANOUT | +#endif SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | SHARED_IMAGE_USAGE_RASTER | SHARED_IMAGE_USAGE_DISPLAY | SHARED_IMAGE_USAGE_OOP_RASTERIZATION; @@ -463,16 +552,18 @@ bool SharedImageBackingFactoryAngleVulkan::IsSupported( bool* allow_legacy_mailbox, bool is_pixel_used) { DCHECK_EQ(gr_context_type, GrContextType::kVulkan); - if (!CanUseAngleVulkanBacking(usage, gr_context_type)) { + if (!CanUseAngleVulkanBacking(usage)) return false; - } - if (is_pixel_used) { + if (thread_safe) return false; - } - if (gmb_type != gfx::EMPTY_BUFFER) { - return false; + switch (gmb_type) { + case gfx::EMPTY_BUFFER: + case gfx::SHARED_MEMORY_BUFFER: + break; + default: + return false; } *allow_legacy_mailbox = false; diff --git a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h index e4f5f19b56b428..70cdac3a3b61a0 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h +++ b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h @@ -65,8 +65,7 @@ class GPU_GLES2_EXPORT SharedImageBackingFactoryAngleVulkan bool is_pixel_used) override; private: - bool CanUseAngleVulkanBacking(uint32_t usage, - GrContextType gr_context_type) const; + bool CanUseAngleVulkanBacking(uint32_t usage) const; raw_ptr context_state_; }; diff --git a/headless/lib/browser/headless_browser_main_parts_linux.cc b/headless/lib/browser/headless_browser_main_parts_linux.cc index eddb96ef148d79..46bd5262d17868 100644 --- a/headless/lib/browser/headless_browser_main_parts_linux.cc +++ b/headless/lib/browser/headless_browser_main_parts_linux.cc @@ -8,12 +8,45 @@ #include "build/chromeos_buildflags.h" #include "device/bluetooth/dbus/bluez_dbus_manager.h" +#if !defined(OS_CHROMEOS) +#include "base/command_line.h" +#include "components/os_crypt/key_storage_config_linux.h" +#include "components/os_crypt/os_crypt.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "headless/app/headless_shell_switches.h" +#endif + namespace headless { +#if !defined(OS_CHROMEOS) +constexpr char kProductName[] = "HeadlessChrome"; +#endif + void HeadlessBrowserMainParts::PostCreateMainMessageLoop() { #if defined(USE_DBUS) && !BUILDFLAG(IS_CHROMEOS_ASH) bluez::BluezDBusManager::Initialize(/*system_bus=*/nullptr); #endif + +#if !defined(OS_CHROMEOS) + // Set up crypt config. This needs to be done before anything starts the + // network service, as the raw encryption key needs to be shared with the + // network service for encrypted cookie storage. + std::unique_ptr config = + std::make_unique(); + // Forward to os_crypt the flag to use a specific password store. + config->store = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kPasswordStore); + // Use a default product name + config->product_name = kProductName; + // OSCrypt may target keyring, which requires calls from the main thread. + config->main_thread_runner = content::GetUIThreadTaskRunner({}); + // OSCrypt can be disabled in a special settings file, but headless doesn't + // need to support that. + config->should_use_preference = false; + config->user_data_path = base::FilePath(); + OSCrypt::SetConfig(std::move(config)); +#endif // !defined(OS_CHROMEOS) } } // namespace headless diff --git a/headless/lib/browser/headless_request_context_manager.cc b/headless/lib/browser/headless_request_context_manager.cc index 7cb79279784e59..7a3307be2b5135 100644 --- a/headless/lib/browser/headless_request_context_manager.cc +++ b/headless/lib/browser/headless_request_context_manager.cc @@ -33,10 +33,6 @@ namespace headless { namespace { -#if defined(OS_LINUX) -constexpr char kProductName[] = "HeadlessChrome"; -#endif - net::NetworkTrafficAnnotationTag GetProxyConfigTrafficAnnotationTag() { static net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("proxy_config_headless", R"( @@ -63,26 +59,16 @@ net::NetworkTrafficAnnotationTag GetProxyConfigTrafficAnnotationTag() { return traffic_annotation; } -void SetCryptConfigOnce(const base::FilePath& user_data_path) { +void SetCryptKeyOnce(const base::FilePath& user_data_path) { static bool done_once = false; if (done_once) return; done_once = true; -#if defined(OS_LINUX) - ::network::mojom::CryptConfigPtr config = - ::network::mojom::CryptConfig::New(); - config->store = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kPasswordStore); - config->product_name = kProductName; - config->should_use_preference = false; - config->user_data_path = user_data_path; - content::GetNetworkService()->SetCryptConfig(std::move(config)); -#elif defined(OS_WIN) && defined(HEADLESS_USE_PREFS) +#if (defined(OS_WIN) || defined(OS_LINUX)) && defined(HEADLESS_USE_PREFS) // The OSCrypt keys are process bound, so if network service is out of // process, send it the required key if it is available. - if (content::IsOutOfProcessNetworkService() && - OSCrypt::IsEncryptionAvailable()) { + if (content::IsOutOfProcessNetworkService()) { content::GetNetworkService()->SetEncryptionKey( OSCrypt::GetRawEncryptionKey()); } @@ -239,7 +225,7 @@ HeadlessRequestContextManager::HeadlessRequestContextManager( } } - SetCryptConfigOnce(user_data_path_); + SetCryptKeyOnce(user_data_path_); } HeadlessRequestContextManager::~HeadlessRequestContextManager() { diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 529c1681d09442..845acacd2fd29c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb @@ -356,6 +356,7 @@ Aşağıdakı addımları izləyin: Dili dəyişmək üçün toxunun. Ayarları açın Dil Əlavə Edin +Tablarda Qiymətləri izləyin Quraşdırmağa davam edin iPhone'unuz üçün hazırlanıb Ayarlar @@ -419,6 +420,7 @@ Ayarı dəyişmək üçün sinxronizasiyanı sıfırlay Səhifədə tapın… Parol ayarlarına daxil olun Bütün cihazlarınızda əlfəcin, tarixçə, parol və digər ayarları əldə etmək üçün Google Hesabınız ilə daxil olun. +Bu Cihazdan silin Parolu kopyalayın Sonra xatırladın Hamısını seçin @@ -520,6 +522,7 @@ Handoff Ayarların Ümumi bölməsindən də aktiv edilə bilər və cihazların Parolları Axtarın Mövcud datanı hesabına əlavə edin. Son Ziyarət +Tablarda qiymət endirimləri göstərilsin. Chrome'da keçidləri açın Şifrələnir... Burada açın... diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index f35ca496e1acca..4421503e2d4ade 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb @@ -356,6 +356,7 @@ Slijedite korake u nastavku: Dodirnite da promijenite jezik. Otvorite Postavke Dodavanje jezika +Prati cijene na karticama Nastavi postavljanje Napravljeno za vaš iPhone Postavke @@ -419,6 +420,7 @@ Da biste promijenili tu postavku, poništite sinkronizac Pronađi na stranici… Pristupite postavkama lozinke Prijavite se na svoj Google račun da dobijete oznake, lozinke, historiju i ostale postavke na svim svojim uređajima. +Ukloni s ovog uređaja Kopiranje lozinke Podsjeti me kasnije Odaberi sve @@ -520,6 +522,7 @@ Također, Handoff mora biti omogućen u odjeljku Opće u Postavkama, a vaši ure Pretražite lozinke Dodajte postojeće podatke na . Nedavno posjećeno +Pogledajte pad cijena na karticama. Otvori URL-ove u Chromeu Šifriranje… Otvori u aplikaciji... diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 1845da71ccba3c..01e6400ba10b70 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb @@ -345,6 +345,7 @@ Følg vejledningen nedenfor: Aktivér kameraet i Indstillinger for at scanne en QR-kode Beskyttet browsing Servicevilkår +Adgangskodeadministrator Synkroniser alt Tryk to gange for at få flere oplysninger Altid diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 36e936c3b4a921..13ff3cf456f86b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb @@ -356,6 +356,7 @@ Πατήστε για αλλαγή γλώσσας. Ανοίξτε τις Ρυθμίσεις Προσθήκη γλώσσας +Παρακολούθηση τιμών σε καρτέλες Συνέχεια ρύθμισης Δημιουργήθηκε για το iPhone Ρυθμίσεις @@ -419,6 +420,7 @@ Εύρεση στη σελίδα… Πρόσβαση στις ρυθμίσεις κωδικού πρόσβασης Συνδεθείτε στον Λογαριασμό σας Google για να λάβετε τους σελιδοδείκτες, τους κωδικούς πρόσβασης, το ιστορικό και άλλες ρυθμίσεις σε όλες τις συσκευές σας. +Κατάργηση από αυτήν τη συσκευή Αντιγραφή κωδικού πρόσβασης Υπενθύμιση αργότερα Επιλογή Όλων @@ -520,6 +522,7 @@ Αναζήτηση κωδικών πρόσβασης Προσθήκη υπαρχόντων δεδομένων στη διεύθυνση . Πραγματοποιήθηκε επίσκεψη πρόσφατα +Δείτε πτώσεις τιμών στις καρτέλες σας. Άνοιγμα URL στο Chrome Κρυπτογράφηση… Άνοιγμα σε... diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index edeb4f85e28faf..aa133c94395109 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb @@ -356,6 +356,7 @@ Follow the steps below: Tap to change language. Open Settings Add language +Track prices on tabs Continue setup Built for your iPhone Settings @@ -419,6 +420,7 @@ To change this setting, reset sync Find in page… Access password settings Sign in with your Google Account to get your bookmarks, passwords, history and other settings on all your devices +Remove from this device Copy password Remind me later Select all @@ -520,6 +522,7 @@ Handoff must also be enabled in the General section of Settings, and your device Search passwords Add existing data to . Recently Visited +See price drops on your tabs. Open URLs in Chrome Encrypting… Open in... diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 2ff3860f15d132..69ff4c427441b5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb @@ -356,6 +356,7 @@ Slijedite korake u nastavku: Dodirnite da biste promijenili jezik. Otvorite Postavke Dodaj jezik +Prati cijene na karticama Nastavi postavljanje Razvijeno za vaš iPhone Postavke @@ -419,6 +420,7 @@ Da biste promijenili tu postavku, poništite sinkronizac Traži na stranici… Pristupite postavkama zaporke Prijavite se Google računom da biste imali pristup svojim oznakama, zaporkama, povijesti i ostalim postavkama na svim svojim uređajima +Ukloni s ovog uređaja Kopiranje zaporke Podsjeti me kasnije Odaberi sve @@ -520,6 +522,7 @@ Handoff mora biti omogućen i u odjeljku Općenito u Postavkama, a vaši uređaj Pretraživanje zaporki Dodavanje postojećih podataka na račun . Nedavno posjećeno +Pogledajte pad cijena na karticama. Otvorite URL-ove u Chromeu Enkripcija… Otvori u... diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 458e657ec7c123..3efc493b63d5f1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb @@ -345,6 +345,7 @@ Svolgi i passaggi che seguono: Per eseguire la scansione di un codice QR, attiva la videocamera dalle impostazioni Navigazione sicura Termini di servizio +Gestione password Sincronizza tutto Tocca due volte per ulteriori informazioni Dall'inizio @@ -356,6 +357,7 @@ Svolgi i passaggi che seguono: Tocca per modificare la lingua. Apri Impostazioni Aggiungi lingua +Monitora prezzi nelle schede Continua configurazione Realizzato per il tuo iPhone Impostazioni @@ -419,6 +421,7 @@ Per cambiare questa impostazione, reimposta la sincroniz Trova nella pagina… Accedi alle impostazioni della password Accedi con il tuo Account Google per avere preferiti, password, cronologia e altre impostazioni su tutti i tuoi dispositivi +Rimuovi da questo dispositivo Copia password Ricordamelo dopo Seleziona tutto @@ -520,6 +523,7 @@ La funzione Handoff deve anche essere attivata nella sezione Generali di Imposta Cerca password Aggiungi i dati esistenti a . Visitati di recente +Visualizza i cali di prezzo nelle tue schede. Apri URL in Chrome Crittografia… Apri in... diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 46dfd7b4753383..3a491c86777a62 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb @@ -345,6 +345,7 @@ ‏כדי לסרוק את קוד ה-QR, יש להפעיל את המצלמה דרך ההגדרות גלישה בטוחה תנאי שירות +מנהל הסיסמאות סנכרון הכול לחיצה פעמיים תציג מידע נוסף משחר ההיסטוריה diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index bb0592343e6c63..1e2e47fb24358d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb @@ -356,6 +356,7 @@ Допрете за да го смените јазикот. Отворете Поставки Додајте јазик +Следете ги цените на картичките Продолжете со поставувањето Создаден за вашиот iPhone Поставки @@ -419,6 +420,7 @@ Најди на страницата… Пристапете до поставките за лозинка Најавете се со сметката на Google за да ги добиете обележувачите, лозинките, историјата и другите поставки на сите ваши уреди. +Отстранете ја од уредов Копирање лозинка Потсети ме подоцна Избери сè @@ -520,6 +522,7 @@ Handoff мора да биде овозможен и во Општиот дел Пребарајте лозинки Додајте ги постоечките податоци во . Неодамна посетени +Гледајте ги попустите на картичките. Отвори ги URL-адресите во Chrome Се шифрира... Отвори во... diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 86d113b2428029..91a9bc26a5b5aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb @@ -356,6 +356,7 @@ ഭാഷ മാറ്റാൻ ടാപ്പ് ചെയ്യുക. ക്രമീകരണം തുറക്കുക ഭാഷ ചേർക്കുക +ടാബുകളിൽ നിരക്കുകൾ ട്രാക്ക് ചെയ്യൂ സജ്ജീകരണം തുടരുക നിങ്ങളുടെ iPhone-നായി നിർമ്മിച്ചത് ക്രമീകരണം @@ -419,6 +420,7 @@ പേജില്‍ കണ്ടെത്തുക… പാസ്‌വേഡ് ക്രമീകരണം ആക്‌സസ് ചെയ്യുക എല്ലാ ഉപകരണങ്ങളിലും നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകൾ, പാസ്‌വേഡുകൾ, ചരിത്രം, മറ്റ് ക്രമീകരണം എന്നിവ ലഭിക്കാൻ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക +ഈ ഉപകരണത്തിൽ നിന്ന് നീക്കം ചെയ്യുക പാസ്‌വേഡ് പകർത്തുക പിന്നീട് ഓർമ്മിപ്പിക്കുക എല്ലാം തിരഞ്ഞെടുക്കുക @@ -520,6 +522,7 @@ പാസ്‌വേഡുകൾ തിരയുക നിലവിലുള്ള വിവരങ്ങളെ എന്നതിലേക്ക് ചേർക്കുക. സമീപകാലത്ത് സന്ദർശിച്ചത് +നിങ്ങളുടെ ടാബുകളിൽ വിലയിടിവുകൾ കാണൂ. Chrome-ൽ URL-കൾ തുറക്കുക എൻക്രിപ്റ്റുചെയ്യുന്നു... ഇതിൽ തുറക്കുക... diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index c72558ee596d75..f2916e8f1dd489 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb @@ -356,6 +356,7 @@ Volg de onderstaande stappen: Tik om de taal te wijzigen. Open Instellingen. Taal toevoegen +Prijzen volgen op tabbladen Doorgaan met instellen Ontworpen voor je iPhone Instellingen @@ -419,6 +420,7 @@ Je gegevens zijn versleuteld met je wachtwoordzin voor synchronisatie. Geef deze Zoeken op pagina… Wachtwoordinstellingen openen Log in met je Google-account om je bookmarks, wachtwoorden, geschiedenis en andere instellingen op al je apparaten te gebruiken +Verwijderen van dit apparaat Wachtwoord kopiëren Later herinneren Selecteer alles @@ -520,6 +522,7 @@ Handoff moet ook aanstaan in het gedeelte Algemeen van Instellingen en je appara Wachtwoorden zoeken Bestaande gegevens toevoegen aan . Recent bezocht +Prijsdalingen bekijken op je tabbladen URL's openen in Chrome Versleutelen… Openen in... diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 9e13070d59e8f4..ea15a233ac1431 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb @@ -354,6 +354,7 @@ Jeśli chcesz usunąć historię wyszukiwania, zapoznaj się z instrukcjami wys Kliknij, by zmienić język. Otwórz Ustawienia Dodaj język +Sprawdzaj ceny na kartach Kontynuuj konfigurowanie Dla Twojego iPhone'a Ustawienia @@ -417,6 +418,7 @@ Aby zmienić to ustawienie, zresetuj synchronizacjęZnajdź na stronie… Otwórz ustawienia haseł Zaloguj się na konto Google, by korzystać z zakładek, haseł, historii i innych ustawień na wszystkich urządzeniach +Usuń z tego urządzenia Skopiuj hasło Przypomnij mi później Wybierz wszystko @@ -518,6 +520,7 @@ Funkcja Handoff musi być też włączona w sekcji Ogólne w Ustawieniach, a urz Szukaj haseł Dodaj istniejące dane do konta . Ostatnio odwiedzone +Pokazuj obniżki cen na kartach. Otwórz adresy URL w Chrome Szyfruję… Otwórz w... diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index e95caf51d7507e..7737f51460869c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb @@ -356,6 +356,7 @@ Siga estas etapas: Toque para mudar o idioma. Abra as Configurações. Adicionar idioma +Monitorar preços nas guias Continuar a configuração Criado para o iPhone Configurações @@ -419,6 +420,7 @@ Para alterar essa configuração, redefina a sincroniza Localizar na página… Acessar configurações de senha Faça login com sua Conta do Google para ter seus favoritos, senhas, histórico e outras configurações em todos os seus dispositivos +Remover deste dispositivo Copiar senha Lembrar mais tarde Selecionar tudo @@ -520,6 +522,7 @@ A "Transição" também deve ser ativada na seção "Geral" das configurações. Pesquisar senhas Adicionar os dados disponíveis à conta . Visitados recentemente +Ver reduções no preço nas suas guias Abrir URLs no Chrome Criptografando… Abrir no... diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index 47d316c4191862..13601be0d06ddc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb @@ -356,6 +356,7 @@ Pratite korake u nastavku: Dodirnite da biste promenili jezik Otvorite Podešavanja Dodajte jezik +Pratite cene na karticama Nastavi podešavanje Napravljeno za iPhone Podešavanja @@ -419,6 +420,7 @@ Da biste promenili ovo podešavanje, resetujte sinhroniz Pronađi na stranici… Pristupite podešavanjima lozinki Prijavite se pomoću Google naloga da biste imali obeleživače, lozinke, istoriju i druga podešavanja na svim uređajima +Ukloni sa ovog uređaja Kopiranje lozinke Podseti me kasnije Izaberi sve @@ -520,6 +522,7 @@ Handoff treba da se omogući u odeljku General (Opšte) u meniju Settings (Pode Pretražite lozinke Dodajte postojeće podatke na . Nedavno posećeno +Pregledajte sniženja na karticama. Otvarajte URL-ove u Chrome-u Šifruje se… Otvori u... diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 205f5e07cfb2dc..62fc812ae81803 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb @@ -356,6 +356,7 @@ Додирните да бисте променили језик Отворите Подешавања Додајте језик +Пратите цене на картицама Настави подешавање Направљено за iPhone Подешавања @@ -419,6 +420,7 @@ Пронађи на страници… Приступите подешавањима лозинки Пријавите се помоћу Google налога да бисте имали обележиваче, лозинке, историју и друга подешавања на свим уређајима +Уклони са овог уређаја Копирање лозинке Подсети ме касније Изабери све @@ -520,6 +522,7 @@ Handoff треба да се омогући у одељку General (Опште) Претражите лозинке Додајте постојеће податке на . Недавно посећено +Прегледајте снижења на картицама. Отварајте URL-ове у Chrome-у Шифрује се… Отвори у... diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index 60b59e4cec82ed..9856045f5cb5ee 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb @@ -356,6 +356,7 @@ Följ stegen nedan: Tryck för att byta språk. Öppna Inställningar Lägg till språk +Bevaka priser på flikar Fortsätt konfigurationen Byggd för iPhone Inställningar @@ -419,6 +420,7 @@ Din data har krypterats med lösenfrasen för synkronisering. Ange den om du vil Hitta på sida … Åtkomst till lösenordsinställningar Logga in med ditt Google-konto så att du kan använda bokmärken, lösenord, historik med mera på alla dina enheter +Ta bort från den här enheten Kopiera lösenord Påminn mig senare Markera alla @@ -520,6 +522,7 @@ Du måste även aktivera Handoff i avsnittet Allmänt i inställningarna och sam Sök efter lösenord Lägg till befintlig data i . Nyligen besökta +Se sänkta priser på flikar Öppna webbadresser i Chrome Krypterar … Öppna i ... diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 639da443333835..ddcbc154c4bc19 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb @@ -356,6 +356,7 @@ భాషను మార్చడానికి నొక్కండి. సెట్టింగ్‌లను తెరవండి భాషను జోడించండి +ధరలను ట్యాబ్‌లలో ట్రాక్ చేయండి సెటప్‌ను కొనసాగించు మీ iPhone కోసం రూపొందించబడింది సెట్టింగ్‌లు @@ -419,6 +420,7 @@ పేజీలో కనుగొను… పాస్‌వర్డ్ సెట్టింగ్‌లను యాక్సెస్ చేయండి మీ బుక్‌మార్క్‌లు, పాస్‌వర్డ్‌లు, చరిత్ర మరియు ఇతర సెట్టింగ్‌లను మీ అన్ని పరికరాలలో పొందడానికి మీ Google ఖాతాతో సైన్ ఇన్ చేయండి +ఈ పరికరం నుండి తీసివేయండి పాస్‌వర్డ్ కాపీచేయడం నాకు తర్వాత గుర్తు చేయి అన్నీ ఎంచుకోండి @@ -520,6 +522,7 @@ పాస్‌వర్డ్‌లను వెతుకు ఇప్పటికే ఉన్న డేటాను కి జోడించండి. ఇటీవల సందర్శించినవి +మీ ట్యాబ్‌లలో ధర తగ్గింపు వివరాలను చూడండి. URLలను Chromeలో తెరవండి గుప్తీకరిస్తోంది… దీనిలో తెరువు... diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index b5e5e41a5c3883..a7e79d83f8816e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb @@ -345,6 +345,7 @@ 如要掃描二維條碼,請在設定中啟用相機 安全瀏覽 服務條款 +密碼管理員 同步處理所有資料 㩒兩下就可以了解詳情 不限時間 diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 3c7088305dcc49..0d5329574634aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb @@ -345,6 +345,7 @@ 如要掃描 QR 圖碼,請在設定中啟用相機 安全瀏覽 服務條款 +密碼管理員 同步處理所有資料 輕觸兩下即可查看更多資訊 不限時間 diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index 3d859ddef07200..2d86e22f0ec64d 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm @@ -95,11 +95,6 @@ namespace { -class MockWebState : public web::FakeWebState { - public: - MOCK_CONST_METHOD0(GetBrowserState, web::BrowserState*(void)); -}; - class FakeNetworkContext : public network::TestNetworkContext { public: FakeNetworkContext() = default; @@ -1247,8 +1242,7 @@ PasswordForm MakeSimpleForm() { } } -// The test case below needs to use MockWebState, thus it needs a different -// SetUp. +// The test cases below need a different SetUp. class PasswordControllerTestSimple : public PlatformTest { public: PasswordControllerTestSimple() {} @@ -1260,9 +1254,6 @@ void SetUp() override { new testing::NiceMock(); ON_CALL(*store_, IsAbleToSavePasswords).WillByDefault(Return(true)); - std::unique_ptr browser_state(builder.Build()); - ON_CALL(web_state_, GetBrowserState) - .WillByDefault(testing::Return(browser_state.get())); UniqueIDDataTabHelper::CreateForWebState(&web_state_); passwordController_ = @@ -1275,13 +1266,12 @@ void SetUp() override { .WillByDefault(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); } + base::test::TaskEnvironment task_environment_; + PasswordController* passwordController_; scoped_refptr store_; MockPasswordManagerClient* weak_client_; - MockWebState web_state_; - base::test::TaskEnvironment task_environment; - TestChromeBrowserState::Builder builder; - std::unique_ptr browser_state; + web::FakeWebState web_state_; }; TEST_F(PasswordControllerTestSimple, SaveOnNonHTMLLandingPage) { diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_helper_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_helper_unittest.mm index 485f16f9f80f8d..77fab87c54b4d1 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller_helper_unittest.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_helper_unittest.mm @@ -16,7 +16,7 @@ #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_navigation_manager.h" -#import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h" +#import "ios/web/public/test/fakes/fake_web_state.h" #include "ios/web/public/test/test_web_thread.h" #include "ios/web/public/test/web_task_environment.h" #include "testing/gtest_mac.h" @@ -49,7 +49,7 @@ void SetUp() override { ios::BookmarkModelFactory::GetForBrowserState( chrome_browser_state_.get())); - web_state_ = std::make_unique(); + web_state_ = std::make_unique(); web_state_->SetBrowserState(chrome_browser_state_.get()); helper_ = [[BrowserViewControllerHelper alloc] init]; @@ -62,7 +62,7 @@ void SetUp() override { web::WebTaskEnvironment task_environment_; std::unique_ptr chrome_browser_state_; - std::unique_ptr web_state_; + std::unique_ptr web_state_; BrowserViewControllerHelper* helper_; }; diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm index a08af75f443144..79307b0a989db0 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm @@ -34,7 +34,6 @@ #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.h" #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_navigation_manager.h" -#import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/browser/web/chrome_web_client.h" #import "ios/chrome/browser/web/chrome_web_test.h" @@ -184,8 +183,8 @@ void SetUpWebStateList() { navigation_item_->SetURL(GURL("http://chromium.org")); navigation_manager->SetVisibleItem(navigation_item_.get()); - std::unique_ptr test_web_state = - std::make_unique(); + std::unique_ptr test_web_state = + std::make_unique(); test_web_state->SetNavigationManager(std::move(navigation_manager)); test_web_state->SetLoading(true); web_state_ = test_web_state.get(); @@ -270,7 +269,7 @@ bool HasEnterpriseInfoItem(FakePopupMenuConsumer* consumer) { BookmarkModel* bookmark_model_; std::unique_ptr prefs_; std::unique_ptr reading_list_model_; - ToolbarTestWebState* web_state_; + web::FakeWebState* web_state_; ToolbarTestNavigationManager* navigation_manager_; std::unique_ptr navigation_item_; id popup_menu_; diff --git a/ios/chrome/browser/ui/toolbar/test/BUILD.gn b/ios/chrome/browser/ui/toolbar/test/BUILD.gn index ab89de905e2c62..459a8a22d37c07 100644 --- a/ios/chrome/browser/ui/toolbar/test/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/test/BUILD.gn @@ -13,8 +13,6 @@ source_set("test") { "toolbar_broadcast_test_util.mm", "toolbar_test_navigation_manager.h", "toolbar_test_navigation_manager.mm", - "toolbar_test_web_state.h", - "toolbar_test_web_state.mm", ] deps = [ diff --git a/ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h b/ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h deleted file mode 100644 index ce99312e27a2f4..00000000000000 --- a/ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TEST_TOOLBAR_TEST_WEB_STATE_H_ -#define IOS_CHROME_BROWSER_UI_TOOLBAR_TEST_TOOLBAR_TEST_WEB_STATE_H_ - -#import "ios/web/public/test/fakes/fake_web_state.h" - -class ToolbarTestWebState : public web::FakeWebState { - public: - ToolbarTestWebState(); - - ToolbarTestWebState(const ToolbarTestWebState&) = delete; - ToolbarTestWebState& operator=(const ToolbarTestWebState&) = delete; - - double GetLoadingProgress() const override; - void set_loading_progress(double loading_progress); - - private: - double loading_progress_; -}; - -#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_TEST_TOOLBAR_TEST_WEB_STATE_H_ diff --git a/ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.mm b/ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.mm deleted file mode 100644 index 07b5b3df258d8e..00000000000000 --- a/ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.mm +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -ToolbarTestWebState::ToolbarTestWebState() : loading_progress_(0) {} - -double ToolbarTestWebState::GetLoadingProgress() const { - return loading_progress_; -} - -void ToolbarTestWebState::set_loading_progress(double loading_progress) { - loading_progress_ = loading_progress; -} diff --git a/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm b/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm index 22e4c38adf72e9..bb4cdcaa9ebfb8 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm @@ -12,7 +12,6 @@ #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_navigation_manager.h" -#import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h" #import "ios/chrome/browser/ui/toolbar/toolbar_consumer.h" #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" #include "ios/chrome/browser/web_state_list/web_state_list.h" @@ -56,7 +55,7 @@ @implementation TestToolbarMediator std::unique_ptr navigation_manager = std::make_unique(); navigation_manager_ = navigation_manager.get(); - test_web_state_ = std::make_unique(); + test_web_state_ = std::make_unique(); test_web_state_->SetBrowserState(chrome_browser_state_.get()); test_web_state_->SetNavigationManager(std::move(navigation_manager)); test_web_state_->SetLoading(true); @@ -102,7 +101,7 @@ void InsertNewWebState(int index) { void SetUpActiveWebState() { web_state_list_->ActivateWebStateAt(0); } TestToolbarMediator* mediator_; - ToolbarTestWebState* web_state_; + web::FakeWebState* web_state_; ToolbarTestNavigationManager* navigation_manager_; std::unique_ptr web_state_list_; FakeWebStateListDelegate web_state_list_delegate_; @@ -111,7 +110,7 @@ void InsertNewWebState(int index) { std::unique_ptr chrome_browser_state_; private: - std::unique_ptr test_web_state_; + std::unique_ptr test_web_state_; }; @@ -356,8 +355,8 @@ void InsertNewWebState(int index) { auto navigation_manager = std::make_unique(); navigation_manager->set_can_go_forward(true); navigation_manager->set_can_go_back(true); - std::unique_ptr test_web_state = - std::make_unique(); + std::unique_ptr test_web_state = + std::make_unique(); test_web_state->SetNavigationManager(std::move(navigation_manager)); test_web_state->SetCurrentURL(GURL(kTestUrl)); test_web_state->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS); diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb index 26d5461065994f..2e6e504bf33b2f 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb @@ -21,6 +21,7 @@ Parollar Google Parol Menecerində saxlanılır və siz onları istənilən cihazda istifadə edə biləsiniz. Chrome Parolunu Avtomatik Doldurun İstifadəçi adı +Chrome'a qayıtdığınız zaman üçün parolunuz Google Parol Menecerində saxlanılacaq. Yardım Chrome Parolu Yoxdur Parolu yadda saxlamaq mümkün deyil diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb index 54a161cb1affa8..944ca9dcc57ab4 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb @@ -21,6 +21,7 @@ Lozinke se pohranjuju u Googleovom Upravitelju lozinki i možete ih koristiti na bilo kojem uređaju. Automatsko popunjavanje lozinke za Chrome Korisničko ime +Zaporka će se spremiti u Google upravitelj zaporki za kada se vratite na Chrome. Pomoć Nema lozinki na Chromeu Nije moguće sačuvati lozinku diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb index 1684e39d5bb2cd..f8ff3ab8a84a78 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb @@ -21,6 +21,7 @@ Οι κωδικοί πρόσβασης αποθηκεύονται στον Διαχειριστή κωδικών πρόσβασης Google και μπορείτε να τους χρησιμοποιείτε σε οποιαδήποτε συσκευή. Αυτοσυμπλήρωση κωδικού πρόσβασης Chrome Όνομα χρήστη +Ο κωδικός πρόσβασής σας θα αποθηκευτεί στον Διαχειριστή κωδικών πρόσβασης Google για τη διεύθυνση όταν επιστρέψετε στο Chrome. Βοήθεια Δεν υπάρχουν κωδικοί πρόσβασης Chrome Δεν είναι δυνατή η αποθήκευση κωδικού πρόσβασης diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb index a8fefd4687c9a8..7cc8c608afab67 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb @@ -21,6 +21,7 @@ Passwords are saved to Google Password Manager and you can use them on any device. Auto-fill Chrome password Username +Your password will be saved to Google Password Manager for when you come back to Chrome. Help No Chrome passwords Can't save password diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb index af7ac87187d0cb..d30ea6b71e232e 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb @@ -9,12 +9,16 @@ Afficher le mot de passe Afficher le mot de passe Mot de passe +Gestionnaire de mots de passe Google Masquer le clavier +Vous pouvez utiliser les mots de passe enregistrés dans d'autres applications de votre appareil. Ils sont enregistrés dans le gestionnaire de mots de passe Google sur cet appareil uniquement. +Pour accéder à vos mots de passe plus rapidement, désélectionnez le trousseau iCloud Vos mots de passe Chrome seront accessibles dans d'autres applications. Vous pouvez désactiver cette option dans l'application Paramètres en tout temps. Champ précédent Utiliser Aucun mot de passe Chrome Remplacer +Les mots de passe sont enregistrés dans le gestionnaire de mots de passe Google et vous pouvez les utiliser sur n'importe quel appareil. Remplir automatiquement le mot de passe dans Chrome Nom d'utilisateur Aide @@ -26,6 +30,7 @@ Accédez aux mots de passe que vous enregistrez dans Chrome à partir de n'importe quelle application. Activer le remplissage automatique Pour commencer, enregistrez quelques mots de passe dans Chrome ou connectez-vous à votre compte Google. +Vous pouvez utiliser les mots de passe enregistrés dans d'autres applications de votre appareil. Ils sont enregistrés dans le gestionnaire de mots de passe Google de ce compte : . facultatif Ajouter un nouveau mot de passe Les mots de passe sont enregistrés dans le gestionnaire de mots de passe Google sur cet appareil uniquement. @@ -54,4 +59,5 @@ Terminé URL Pour +Les mots de passe sont enregistrés dans le gestionnaire de mots de passe Google sur cet appareil uniquement. \ No newline at end of file diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb index 31bc64c588768e..5747a22f3fcc7a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb @@ -21,6 +21,7 @@ Zaporke se spremaju u Google upravitelj zaporki i možete ih koristiti na bilo kojem uređaju. Automatsko popunjavanje zaporki u Chromeu Korisničko ime +Zaporka će se spremiti u Google upravitelj zaporki za kada se vratite na Chrome. Pomoć Nema zaporki za Chrome Spremanje zaporke nije uspjelo diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb index 078886dab2ad68..e1b5840ded1c23 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb @@ -21,6 +21,7 @@ Le password vengono salvate in Gestore delle password di Google e puoi usarle su qualsiasi dispositivo. Usa Riempimento automatico per password di Chrome Nome utente +La tua password verrà salvata in Gestore delle password di Google () quando tornerai in Chrome. Guida Nessuna password di Chrome Impossibile salvare la password diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb index fbc9e5b5fec359..52479103480da7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb @@ -21,6 +21,7 @@ Лозинките се зачувани во „Управникот со лозинки на Google“ и може да ги користите на кој било уред. Автоматско пополнување лозинка на Chrome Корисничко име +Лозинката ќе се зачува во „Управникот со лозинки на Google“ за кога ќе се вратите на Chrome. Помош Нема лозинки на Chrome Не може да се зачува лозинката diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb index 4476917672ba6b..2fed2f563b09db 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb @@ -21,6 +21,7 @@ Google പാസ്‌വേഡ് മാനേജറിൽ പാസ്‌വേഡുകൾ സംരക്ഷിക്കുന്നതിനാൽ അവ നിങ്ങൾക്ക് ഏത് ഉപകരണത്തിലും ഉപയോഗിക്കാം. Chrome പാസ്‌വേഡ് സ്വയമേവ പൂരിപ്പിക്കൽ ഉപയോക്തൃനാമം +നിങ്ങൾ Chrome-ലേക്ക് മടങ്ങിയെത്തുമ്പോൾ, എന്നതിനുള്ള Google പാസ്‌വേഡ് മാനേജറിൽ നിങ്ങളുടെ പാസ്‌വേഡ് സംരക്ഷിക്കും. സഹായം Chrome പാസ്‌വേഡുകളൊന്നുമില്ല പാസ്‌വേഡ് സംരക്ഷിക്കാനാകുന്നില്ല diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb index 3ebb7615dc2197..1930c7754423c1 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb @@ -21,6 +21,7 @@ Wachtwoorden worden opgeslagen in Google Wachtwoordmanager zodat je ze op elk apparaat kunt gebruiken. Chrome-wachtwoord automatisch invullen Gebruikersnaam +Je wachtwoord wordt opgeslagen in Google Wachtwoordmanager voor als je teruggaat naar Chrome. Help Geen Chrome-wachtwoorden Kan wachtwoord niet opslaan diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb index 8e241b1323d1a1..e2fd3b67476310 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb @@ -21,6 +21,7 @@ Hasła są zapisywane w Menedżerze haseł Google i możesz ich używać na dowolnym urządzeniu. Wypełniaj hasła w Chrome Nazwa użytkownika +Gdy ponownie otworzysz Chrome, Twoje hasło będzie zapisane w menedżerze haseł Google dla konta . Pomoc Brak haseł w Chrome Nie udało się zapisać hasła diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb index 640d445bb7173c..a3d1c0092d1162 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb @@ -21,6 +21,7 @@ As senhas são salvas no Gerenciador de senhas do Google para que você as use em qualquer dispositivo. Preenchimento automático de senha do Chrome Nome de usuário +Quando você voltar ao Chrome, sua senha vai estar armazenada no Gerenciador de senhas do Google da conta . Ajuda Não há nenhuma senha no Chrome Não foi possível salvar a senha diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb index 297ecf2e06f81c..8943bf95e6b56c 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb @@ -21,6 +21,7 @@ Lozinke se čuvaju u Google menadžeru lozinki da biste mogli da ih koristite na bilo kom uređaju. Automatsko popunjavanje lozinke za Chrome Korisničko ime +Lozinka će biti sačuvana u Google menadžeru lozinki za kad se vratite u Chrome. Pomoć Nema lozinki za Chrome Čuvanje lozinke nije uspelo diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb index b10367b985b14f..be9ad21cc1d7de 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb @@ -21,6 +21,7 @@ Лозинке се чувају у Google менаџеру лозинки да бисте могли да их користите на било ком уређају. Аутоматско попуњавање лозинке за Chrome Корисничко име +Лозинка ће бити сачувана у Google менаџеру лозинки за кад се вратите у Chrome. Помоћ Нема лозинки за Chrome Чување лозинке није успело diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb index a32794a809d196..e4f4a18944300a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb @@ -21,6 +21,7 @@ Lösenorden sparas med Google Lösenordshantering så att du kan använda dem på vilken enhet som helst. Autofyll lösenord i Chrome Användarnamn +Lösenordet sparas med Google Lösenordshantering för när du återgår till Chrome. Hjälp Inga lösenord i Chrome Det gick inte att spara lösenordet diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb index e5e2697e485bdc..8c575e437e5aed 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb @@ -21,6 +21,7 @@ పాస్‌వర్డ్‌లు Google పాస్‌వర్డ్ మేనేజర్‌లో సేవ్ చేయబడతాయి, కాబట్టి మీరు వాటిని ఏ పరికరంలో అయినా ఉపయోగించవచ్చు. Chrome పాస్‌వర్డ్‌ను ఆటోఫిల్ చేయండి యూజర్‌నేమ్ +మీరు Chromeకు తిరిగి వచ్చినప్పుడు, కోసం మీ పాస్‌వర్డ్ Google పాస్‌వర్డ్ మేనేజర్‌లో సేవ్ చేయబడుతుంది. సహాయం Chrome పాస్‌వర్డ్‌లు ఏవీ లేవు పాస్‌వర్డ్‌ను సేవ్ చేయడం సాధ్యం కాదు diff --git a/media/fuchsia/cdm/service/BUILD.gn b/media/fuchsia/cdm/service/BUILD.gn index e3169ffabe7616..d281a112869885 100644 --- a/media/fuchsia/cdm/service/BUILD.gn +++ b/media/fuchsia/cdm/service/BUILD.gn @@ -19,7 +19,6 @@ source_set("service") { ] deps = [ - "//media/fuchsia/mojom", "//third_party/fuchsia-sdk/sdk/pkg/fit-promise", "//url", ] diff --git a/media/fuchsia/mojom/BUILD.gn b/media/fuchsia/mojom/BUILD.gn index c4e78387148c28..bb2f01f39ce28f 100644 --- a/media/fuchsia/mojom/BUILD.gn +++ b/media/fuchsia/mojom/BUILD.gn @@ -4,37 +4,6 @@ import("//mojo/public/tools/bindings/mojom.gni") -mojom("mojom") { - sources = [ "fuchsia_media_resource_provider.mojom" ] - - export_class_attribute_blink = "BLINK_PLATFORM_EXPORT" - export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1" - export_header_blink = "third_party/blink/public/platform/web_common.h" - - shared_cpp_typemaps = { - types = [ - { - mojom = "media.mojom.AudioConsumerRequest" - cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioConsumer>" - move_only = true - }, - { - mojom = "media.mojom.AudioCapturerRequest" - cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioCapturer>" - move_only = true - }, - ] - traits_headers = [ "fuchsia_media_resource_provider_mojom_traits.h" ] - traits_public_deps = [ - "//fuchsia/mojom:traits", - "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media", - ] - } - - cpp_typemaps = [ shared_cpp_typemaps ] - blink_cpp_typemaps = [ shared_cpp_typemaps ] -} - mojom("cdm_provider") { sources = [ "fuchsia_cdm_provider.mojom" ] diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc index f1ede3f6dc2638..f64b937ea052f0 100644 --- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc +++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc @@ -45,8 +45,7 @@ constexpr uint32_t kCPBWindowSizeMs = 1500; // Subjectively chosen. // Generally use up to 2 reference frames. -constexpr size_t kMaxNumReferenceFrames = 2; -constexpr size_t kMaxRefIdxL0Size = kMaxNumReferenceFrames; +constexpr size_t kMaxRefIdxL0Size = 2; // HRD parameters (ch. E.2.2 in H264 spec). constexpr int kBitRateScale = 0; // bit_rate_scale for SPS HRD parameters. @@ -209,7 +208,7 @@ H264VaapiVideoEncoderDelegate::EncodeParams::EncodeParams() initial_qp(kDefaultQP), min_qp(kMinQP), max_qp(kMaxQP), - max_num_ref_frames(kMaxNumReferenceFrames), + max_num_ref_frames(kMaxRefIdxL0Size), max_ref_pic_list0_size(kMaxRefIdxL0Size) {} H264VaapiVideoEncoderDelegate::H264VaapiVideoEncoderDelegate( @@ -327,8 +326,7 @@ bool H264VaapiVideoEncoderDelegate::Initialize( num_temporal_layers_ > 1u ? num_temporal_layers_ - 1 : std::min(kMaxRefIdxL0Size, ave_config.max_num_ref_frames & 0xffff); - curr_params_.max_num_ref_frames = - std::min(kMaxNumReferenceFrames, curr_params_.max_ref_pic_list0_size); + curr_params_.max_num_ref_frames = curr_params_.max_ref_pic_list0_size; bool submit_packed_sps = false; bool submit_packed_pps = false; @@ -454,10 +452,8 @@ bool H264VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) { // below maximum size, dropping oldest references. if (pic->ref) { ref_pic_list0_.push_front(pic); - const size_t max_num_ref_frames = - base::checked_cast(current_sps_.max_num_ref_frames); - while (ref_pic_list0_.size() > max_num_ref_frames) - ref_pic_list0_.pop_back(); + ref_pic_list0_.resize( + std::min(curr_params_.max_ref_pic_list0_size, ref_pic_list0_.size())); } num_encoded_frames_++; diff --git a/mojo/core/BUILD.gn b/mojo/core/BUILD.gn index d0794f610320e6..96b39f29c14851 100644 --- a/mojo/core/BUILD.gn +++ b/mojo/core/BUILD.gn @@ -73,6 +73,7 @@ template("core_impl_source_set") { sources = [ "atomic_flag.h", + "atomic_flag.cc", "broker.h", "channel.cc", "configuration.cc", diff --git a/mojo/core/atomic_flag.cc b/mojo/core/atomic_flag.cc new file mode 100644 index 00000000000000..8692590096f7a0 --- /dev/null +++ b/mojo/core/atomic_flag.cc @@ -0,0 +1,13 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mojo/core/atomic_flag.h" + +namespace mojo { +namespace core { + +AtomicFlag::AtomicFlag(): flag_(false) {} + +} // namespace core +} // namespace mojo diff --git a/mojo/core/atomic_flag.h b/mojo/core/atomic_flag.h index 93b82dbf70d35a..e73cd051d20498 100644 --- a/mojo/core/atomic_flag.h +++ b/mojo/core/atomic_flag.h @@ -5,7 +5,7 @@ #ifndef MOJO_CORE_ATOMIC_FLAG_H_ #define MOJO_CORE_ATOMIC_FLAG_H_ -#include "base/atomicops.h" +#include namespace mojo { namespace core { @@ -31,21 +31,20 @@ namespace core { // } class AtomicFlag { public: - AtomicFlag() : flag_(0) {} - + AtomicFlag(); AtomicFlag(const AtomicFlag&) = delete; AtomicFlag& operator=(const AtomicFlag&) = delete; ~AtomicFlag() = default; - void Set(bool value) { base::subtle::Release_Store(&flag_, value ? 1 : 0); } + void Set(bool value) { flag_.store(value, std::memory_order_release); } - bool Get() const { return base::subtle::Acquire_Load(&flag_) ? true : false; } + bool Get() const { return flag_.load(std::memory_order_acquire); } operator const bool() const { return Get(); } private: - base::subtle::Atomic32 flag_; + std::atomic flag_; }; } // namespace core diff --git a/mojo/core/user_message_impl.cc b/mojo/core/user_message_impl.cc index 33fdbf5c204861..927b19fab6581e 100644 --- a/mojo/core/user_message_impl.cc +++ b/mojo/core/user_message_impl.cc @@ -5,9 +5,9 @@ #include "mojo/core/user_message_impl.h" #include +#include #include -#include "base/atomicops.h" #include "base/debug/dump_without_crashing.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" @@ -267,14 +267,14 @@ MojoResult CreateOrExtendSerializedEventMessage( return MOJO_RESULT_OK; } -base::subtle::Atomic32 g_message_count = 0; +std::atomic g_message_count{0}; void IncrementMessageCount() { - base::subtle::NoBarrier_AtomicIncrement(&g_message_count, 1); + g_message_count.fetch_add(1, std::memory_order_relaxed); } void DecrementMessageCount() { - base::subtle::NoBarrier_AtomicIncrement(&g_message_count, -1); + g_message_count.fetch_add(-1, std::memory_order_relaxed); } class MessageMemoryDumpProvider : public base::trace_event::MemoryDumpProvider { @@ -300,7 +300,7 @@ class MessageMemoryDumpProvider : public base::trace_event::MemoryDumpProvider { auto* dump = pmd->CreateAllocatorDump("mojo/messages"); dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameObjectCount, base::trace_event::MemoryAllocatorDump::kUnitsObjects, - base::subtle::NoBarrier_Load(&g_message_count)); + g_message_count.load(std::memory_order_relaxed)); return true; } }; diff --git a/services/network/network_context.cc b/services/network/network_context.cc index f8e93f5926b60e..1840b5fd647a87 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc @@ -2544,11 +2544,6 @@ NetworkContext::MakeSessionCleanupCookieStore() const { net::CookieCryptoDelegate* crypto_delegate = nullptr; if (params_->enable_encrypted_cookies) { -#if defined(OS_LINUX) && !BUILDFLAG(IS_CHROMECAST) - DCHECK(network_service_->os_crypt_config_set()) - << "NetworkService::SetCryptConfig must be called before creating a " - "NetworkContext with encrypted cookies."; -#endif crypto_delegate = cookie_config::GetCookieCryptoDelegate(); } diff --git a/services/network/network_service.cc b/services/network/network_service.cc index e7dc472da7d77b..ee8ba841b5bcc9 100644 --- a/services/network/network_service.cc +++ b/services/network/network_service.cc @@ -381,10 +381,6 @@ NetworkService::~NetworkService() { trace_net_log_observer_.StopWatchForTraceStart(); } -void NetworkService::set_os_crypt_is_configured() { - os_crypt_config_set_ = true; -} - std::unique_ptr NetworkService::Create( mojo::PendingReceiver receiver) { return std::make_unique(nullptr, std::move(receiver)); @@ -617,28 +613,9 @@ void NetworkService::OnCertDBChanged() { net::CertDatabase::GetInstance()->NotifyObserversCertDBChanged(); } -#if defined(OS_LINUX) -void NetworkService::SetCryptConfig(mojom::CryptConfigPtr crypt_config) { -#if !BUILDFLAG(IS_CHROMECAST) - DCHECK(!os_crypt_config_set_); - auto config = std::make_unique(); - config->store = crypt_config->store; - config->product_name = crypt_config->product_name; - config->application_name = crypt_config->application_name; - config->main_thread_runner = base::ThreadTaskRunnerHandle::Get(); - config->should_use_preference = crypt_config->should_use_preference; - config->user_data_path = crypt_config->user_data_path; - OSCrypt::SetConfig(std::move(config)); - os_crypt_config_set_ = true; -#endif -} -#endif - -#if defined(OS_WIN) || defined(OS_MAC) void NetworkService::SetEncryptionKey(const std::string& encryption_key) { OSCrypt::SetRawEncryptionKey(encryption_key); } -#endif void NetworkService::AddAllowedRequestInitiatorForPlugin( int32_t process_id, diff --git a/services/network/network_service.h b/services/network/network_service.h index 3dcea20355d677..91fae509fc6eba 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h @@ -87,11 +87,6 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService ~NetworkService() override; - // Call to inform the NetworkService that OSCrypt::SetConfig() has already - // been invoked, so OSCrypt::SetConfig() does not need to be called before - // encrypted storage can be used. - void set_os_crypt_is_configured(); - // Allows late binding if the mojo receiver wasn't specified in the // constructor. void Bind(mojo::PendingReceiver receiver); @@ -164,12 +159,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService base::span crl_set, mojom::NetworkService::UpdateCRLSetCallback callback) override; void OnCertDBChanged() override; -#if defined(OS_LINUX) - void SetCryptConfig(mojom::CryptConfigPtr crypt_config) override; -#endif -#if defined(OS_WIN) || defined(OS_MAC) void SetEncryptionKey(const std::string& encryption_key) override; -#endif void AddAllowedRequestInitiatorForPlugin( int32_t process_id, const url::Origin& allowed_request_initiator) override; @@ -251,8 +241,6 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService FirstPartySets* first_party_sets() const { return first_party_sets_.get(); } - bool os_crypt_config_set() const { return os_crypt_config_set_; } - void set_host_resolver_factory_for_testing( std::unique_ptr host_resolver_factory) { host_resolver_factory_ = std::move(host_resolver_factory); @@ -369,8 +357,6 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService bool quic_disabled_ = false; - bool os_crypt_config_set_ = false; - std::unique_ptr crl_set_distributor_; // Whether new NetworkContexts will be configured to partition their diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn index c62cabab99fceb..62893611492e44 100644 --- a/services/network/public/mojom/BUILD.gn +++ b/services/network/public/mojom/BUILD.gn @@ -954,12 +954,6 @@ mojom("mojom") { } } - # This is only needed on desktop linux, but the defines make this difficult - # because IS_CHROMECAST is not available in build/build_config.h. - if (is_linux) { - enabled_features += [ "needs_crypt_config" ] - } - # Typemaps which apply to both Blink and non-Blink bindings. shared_cpp_typemaps = [] diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index 5d44e018c290f0..032cf2cb19236f 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom @@ -96,29 +96,6 @@ struct HttpAuthDynamicParams { bool basic_over_http_enabled = true; }; -// Values for configuring OSCrypt. -[EnableIf=needs_crypt_config] -struct CryptConfig { - // Force OSCrypt to use a specific linux password store. - string store; - - // The product name to use for permission prompts. - string product_name; - - // The application name to store the crypto key against. For Chromium/Chrome - // builds leave this unset and it will default correctly. This config option - // is for embedders to provide their application name in place of "Chromium". - // Only used when the allow_runtime_configurable_key_storage feature is - // enabled - string application_name; - - // Controls whether preference on using or ignoring backends is used. - bool should_use_preference; - - // Preferences are stored in a separate file in the user data directory. - mojo_base.mojom.FilePath user_data_path; -}; - // Represents the value of a single environment variable. struct EnvironmentVariable { string name; @@ -286,17 +263,7 @@ interface NetworkService { // Notification that the certificate database has been modified. OnCertDBChanged(); - // Sets up OSCrypt for the network service process. Must be called before - // encrypted cookies can be read or set. - [EnableIf=needs_crypt_config] - SetCryptConfig(CryptConfig crypt_config); - - // Send the encryption key to the network service to use for AES encryption. - [EnableIf=is_mac] - SetEncryptionKey(mojo_base.mojom.ByteString encryption_key); - // Send the encryption key to the network service to use for AES encryption. - [EnableIf=is_win] SetEncryptionKey(mojo_base.mojom.ByteString encryption_key); // Notifies |request_initiator_origin_lock| enforcement code that |process_id| diff --git a/third_party/blink/public/strings/translations/blink_strings_lv.xtb b/third_party/blink/public/strings/translations/blink_strings_lv.xtb index 33e579c1b57580..85058b6b12205a 100644 --- a/third_party/blink/public/strings/translations/blink_strings_lv.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_lv.xtb @@ -230,7 +230,7 @@ gggg Nederīga pareizrakstība Pa labi vērstas skujiņas ikona -Paraksti +Subtitri Nederīga vērtība. Vērtībai ir jābūt no  līdz . pagājušais laiks: diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc index cc2fbf9145d6bb..66b9db782136b7 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc @@ -22,7 +22,6 @@ #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scroll_types.h" diff --git a/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc b/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc index a69bb9e58c9c49..6a3fb442ffdf1c 100644 --- a/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc +++ b/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc @@ -483,19 +483,19 @@ TEST_F(AffectedByPseudoTest, UpdateAllLifecyclePhasesForTest(); EXPECT_TRUE( GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); + EXPECT_TRUE(GetElementById("div2") + ->GetComputedStyle() + ->AncestorsAffectedByHoverInHas()); EXPECT_FALSE( GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); + EXPECT_TRUE(GetElementById("div3") + ->GetComputedStyle() + ->AncestorsAffectedByHoverInHas()); EXPECT_FALSE( GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); + EXPECT_TRUE(GetElementById("div4") + ->GetComputedStyle() + ->AncestorsAffectedByHoverInHas()); EXPECT_TRUE( GetElementById("div5")->GetComputedStyle()->AffectedByPseudoInHas()); EXPECT_TRUE(GetElementById("div5") @@ -547,66 +547,6 @@ TEST_F(AffectedByPseudoTest, UpdateAllLifecyclePhasesForTest(); unsigned element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(0U, element_count); - GetElementById("div3")->SetHovered(false); - UpdateAllLifecyclePhasesForTest(); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div4")->SetHovered(true); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(0U, element_count); - GetElementById("div4")->SetHovered(false); - UpdateAllLifecyclePhasesForTest(); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div4")->setAttribute(html_names::kClassAttr, "b"); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(3U, element_count); - - EXPECT_TRUE( - GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div3")->setAttribute(html_names::kClassAttr, "b"); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(1U, element_count); - - EXPECT_TRUE( - GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div3")->SetHovered(true); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; ASSERT_EQ(1U, element_count); GetElementById("div3")->SetHovered(false); UpdateAllLifecyclePhasesForTest(); @@ -620,7 +560,7 @@ TEST_F(AffectedByPseudoTest, UpdateAllLifecyclePhasesForTest(); start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div3")->setAttribute(html_names::kClassAttr, ""); + GetElementById("div4")->setAttribute(html_names::kClassAttr, "b"); UpdateAllLifecyclePhasesForTest(); element_count = GetStyleEngine().StyleForElementCount() - start_count; ASSERT_EQ(1U, element_count); @@ -641,28 +581,6 @@ TEST_F(AffectedByPseudoTest, ->GetComputedStyle() ->AncestorsAffectedByHoverInHas()); - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div4")->setAttribute(html_names::kClassAttr, ""); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(3U, element_count); - - EXPECT_TRUE( - GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - start_count = GetStyleEngine().StyleForElementCount(); GetElementById("div6")->SetHovered(true); UpdateAllLifecyclePhasesForTest(); diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc index 1321970f8c832f..2ceb47eb1bf11d 100644 --- a/third_party/blink/renderer/core/css/css_selector.cc +++ b/third_party/blink/renderer/core/css/css_selector.cc @@ -1058,11 +1058,6 @@ void CSSSelector::SetSelectorList( data_.rare_data_->selector_list_ = std::move(selector_list); } -void CSSSelector::SetContainsPseudoInsideHasPseudoClass() { - CreateRareData(); - data_.rare_data_->contains_pseudo_inside_has_pseudo_class_ = true; -} - static bool ValidateSubSelector(const CSSSelector* selector) { switch (selector->Match()) { case CSSSelector::kTag: @@ -1263,8 +1258,7 @@ CSSSelector::RareData::RareData(const AtomicString& value) serializing_value_(value), bits_(), attribute_(AnyQName()), - argument_(g_null_atom), - contains_pseudo_inside_has_pseudo_class_(false) {} + argument_(g_null_atom) {} CSSSelector::RareData::~RareData() = default; diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h index 85c7d64b74f8c5..027a42e59ddd93 100644 --- a/third_party/blink/renderer/core/css/css_selector.h +++ b/third_party/blink/renderer/core/css/css_selector.h @@ -354,11 +354,6 @@ class CORE_EXPORT CSSSelector { const Vector* PartNames() const { return has_rare_data_ ? data_.rare_data_->part_names_.get() : nullptr; } - bool ContainsPseudoInsideHasPseudoClass() const { - return has_rare_data_ - ? data_.rare_data_->contains_pseudo_inside_has_pseudo_class_ - : false; - } #ifndef NDEBUG void Show() const; @@ -371,7 +366,6 @@ class CORE_EXPORT CSSSelector { void SetArgument(const AtomicString&); void SetSelectorList(std::unique_ptr); void SetPartNames(std::unique_ptr>); - void SetContainsPseudoInsideHasPseudoClass(); void SetNth(int a, int b); bool MatchNth(unsigned count) const; @@ -492,7 +486,6 @@ class CORE_EXPORT CSSSelector { selector_list_; // Used for :-webkit-any and :not std::unique_ptr> part_names_; // Used for ::part() selectors. - bool contains_pseudo_inside_has_pseudo_class_; // Used for :has() selectors private: RareData(const AtomicString& value); diff --git a/third_party/blink/renderer/core/css/parser/css_parser_selector.cc b/third_party/blink/renderer/core/css/parser/css_parser_selector.cc index 737a646a5f0581..362d4faef74036 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_selector.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_selector.cc @@ -58,10 +58,6 @@ void CSSParserSelector::SetSelectorList( selector_->SetSelectorList(std::move(selector_list)); } -void CSSParserSelector::SetContainsPseudoInsideHasPseudoClass() { - selector_->SetContainsPseudoInsideHasPseudoClass(); -} - void CSSParserSelector::AppendTagHistory( CSSSelector::RelationType relation, std::unique_ptr selector) { diff --git a/third_party/blink/renderer/core/css/parser/css_parser_selector.h b/third_party/blink/renderer/core/css/parser/css_parser_selector.h index 2e244c65d8c572..fff17e17e29f31 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_selector.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_selector.h @@ -79,7 +79,6 @@ class CORE_EXPORT CSSParserSelector { Vector>& selector_vector); void SetSelectorList(std::unique_ptr); void SetAtomics(std::unique_ptr); - void SetContainsPseudoInsideHasPseudoClass(); bool IsHostPseudoSelector() const; diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser.cc b/third_party/blink/renderer/core/css/parser/css_selector_parser.cc index 8c2f145fb61731..8f8074b3565abc 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser.cc +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser.cc @@ -784,9 +784,6 @@ std::unique_ptr CSSSelectorParser::ConsumePseudo( bool has_arguments = token.GetType() == kFunctionToken; selector->UpdatePseudoType(value, *context_, has_arguments, context_->Mode()); - if (UNLIKELY(is_inside_has_argument_)) - found_pseudo_in_has_argument_ = true; - if (selector->Match() == CSSSelector::kPseudoElement) { switch (selector->GetPseudoType()) { case CSSSelector::kPseudoBefore: @@ -880,11 +877,6 @@ std::unique_ptr CSSSelectorParser::ConsumePseudo( DisallowPseudoElementsScope scope(this); base::AutoReset resist_namespace(&resist_default_namespace_, true); - base::AutoReset is_inside_has_argument(&is_inside_has_argument_, - true); - base::AutoReset found_pseudo_in_has_argument( - &found_pseudo_in_has_argument_, false); - std::unique_ptr selector_list = std::make_unique(); *selector_list = ConsumeRelativeSelectorList(block); @@ -892,8 +884,6 @@ std::unique_ptr CSSSelectorParser::ConsumePseudo( return nullptr; selector->SetSelectorList(std::move(selector_list)); - if (UNLIKELY(found_pseudo_in_has_argument_)) - selector->SetContainsPseudoInsideHasPseudoClass(); return selector; } case CSSSelector::kPseudoNot: { diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser.h b/third_party/blink/renderer/core/css/parser/css_selector_parser.h index b227d976dc4cd3..b2047bd21f834b 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser.h +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser.h @@ -150,11 +150,6 @@ class CORE_EXPORT CSSSelectorParser { // the default namespace is '*' while this flag is true. bool ignore_default_namespace_ = false; - // The 'found_pseudo_in_has_argument flag is true when we found any pseudo in - // ':has()' argument while parsing. - bool found_pseudo_in_has_argument_ = false; - bool is_inside_has_argument_ = false; - class DisallowPseudoElementsScope { STACK_ALLOCATED(); diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc index 145ee2de4d8f6c..da5378ad4c73bd 100644 --- a/third_party/blink/renderer/core/css/selector_checker.cc +++ b/third_party/blink/renderer/core/css/selector_checker.cc @@ -664,8 +664,6 @@ bool SelectorChecker::CheckPseudoHas(const SelectorCheckingContext& context, sub_context.scope = context.scope; // sub_context.is_inside_visited_link is false (by default) to disable // :visited matching when it is in the :has argument - sub_context.is_inside_has_pseudo_class = true; - sub_context.pseudo_has_in_rightmost_compound = context.in_rightmost_compound; DCHECK(context.selector->SelectorList()); for (const CSSSelector* selector = context.selector->SelectorList()->First(); @@ -817,6 +815,69 @@ bool SelectorChecker::CheckPseudoHas(const SelectorCheckingContext& context, return false; } +namespace { + +struct HasPseudoClassArgumentInfo { + bool contains_pseudo = false; + bool contains_hover = false; + bool contains_active = false; + bool contains_focus = false; + bool contains_focus_visible = false; + + explicit HasPseudoClassArgumentInfo(const CSSSelectorList* selector_list) { + DCHECK(selector_list); + + for (const CSSSelector* relative_selector = selector_list->First(); + relative_selector; + relative_selector = CSSSelectorList::Next(*relative_selector)) { + DCHECK(relative_selector); + + for (const CSSSelector* simple = relative_selector; + simple && + simple->GetPseudoType() != CSSSelector::kPseudoRelativeLeftmost; + simple = simple->TagHistory()) { + switch (simple->GetPseudoType()) { + case CSSSelector::kPseudoUnknown: + break; + case CSSSelector::kPseudoHover: + contains_pseudo = true; + contains_hover = true; + break; + case CSSSelector::kPseudoActive: + contains_pseudo = true; + contains_active = true; + break; + case CSSSelector::kPseudoFocus: + case CSSSelector::kPseudoFocusWithin: + contains_pseudo = true; + contains_focus = true; + break; + case CSSSelector::kPseudoFocusVisible: + contains_pseudo = true; + contains_focus_visible = true; + break; + default: + contains_pseudo = true; + break; + } + } + } + } + + void SetDynamicRestyleFlagsForHas(ComputedStyle* style) { + if (contains_hover) + style->SetAncestorsAffectedByHoverInHas(); + if (contains_active) + style->SetAncestorsAffectedByActiveInHas(); + if (contains_focus) + style->SetAncestorsAffectedByFocusInHas(); + if (contains_focus_visible) + style->SetAncestorsAffectedByFocusVisibleInHas(); + } +}; + +} // namespace + bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, MatchResult& result) const { Element& element = *context.element; @@ -1012,38 +1073,19 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, } return element.IsDragged(); case CSSSelector::kPseudoFocus: - if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByFocusInHas(); - } else { - if (!context.in_rightmost_compound) - element.SetChildrenOrSiblingsAffectedByFocus(); - } - } + if (mode_ == kResolvingStyle && !context.in_rightmost_compound) + element.SetChildrenOrSiblingsAffectedByFocus(); return MatchesFocusPseudoClass(element); case CSSSelector::kPseudoFocusVisible: - if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByFocusVisibleInHas(); - } else { - if (!context.in_rightmost_compound) - element.SetChildrenOrSiblingsAffectedByFocusVisible(); - } - } + if (mode_ == kResolvingStyle && !context.in_rightmost_compound) + element.SetChildrenOrSiblingsAffectedByFocusVisible(); return MatchesFocusVisiblePseudoClass(element); case CSSSelector::kPseudoFocusWithin: if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByFocusInHas(); - } else { - if (context.in_rightmost_compound) - element_style_->SetAffectedByFocusWithin(); - else - element.SetChildrenOrSiblingsAffectedByFocusWithin(); - } + if (context.in_rightmost_compound) + element_style_->SetAffectedByFocusWithin(); + else + element.SetChildrenOrSiblingsAffectedByFocusWithin(); } probe::ForcePseudoState(&element, CSSSelector::kPseudoFocusWithin, &force_pseudo_state); @@ -1052,15 +1094,10 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, return element.HasFocusWithin(); case CSSSelector::kPseudoHover: if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByHoverInHas(); - } else { - if (context.in_rightmost_compound) - element_style_->SetAffectedByHover(); - else - element.SetChildrenOrSiblingsAffectedByHover(); - } + if (context.in_rightmost_compound) + element_style_->SetAffectedByHover(); + else + element.SetChildrenOrSiblingsAffectedByHover(); } if (!ShouldMatchHoverOrActive(context)) return false; @@ -1071,15 +1108,10 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, return element.IsHovered(); case CSSSelector::kPseudoActive: if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByActiveInHas(); - } else { - if (context.in_rightmost_compound) - element_style_->SetAffectedByActive(); - else - element.SetChildrenOrSiblingsAffectedByActive(); - } + if (context.in_rightmost_compound) + element_style_->SetAffectedByActive(); + else + element.SetChildrenOrSiblingsAffectedByActive(); } if (!ShouldMatchHoverOrActive(context)) return false; @@ -1289,8 +1321,14 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, // ':has()' selector. element_style_->SetAffectedByHas(); element_style_->SetAncestorsAffectedByHas(); - if (selector.ContainsPseudoInsideHasPseudoClass()) + + // TODO(blee@igalia.com) Move the logic in HasPseudoClassArgumentInfo + // to HasArgumentMatchContext + HasPseudoClassArgumentInfo argument(selector.SelectorList()); + if (argument.contains_pseudo) element_style_->SetAffectedByPseudoInHas(); + if (context.in_rightmost_compound) + argument.SetDynamicRestyleFlagsForHas(element_style_); } // TODO(blee@igalia.com) non-terminal ':has() is not supported yet } diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h index 038dc688057a29..1b9deca24432c5 100644 --- a/third_party/blink/renderer/core/css/selector_checker.h +++ b/third_party/blink/renderer/core/css/selector_checker.h @@ -122,8 +122,6 @@ class CORE_EXPORT SelectorChecker { bool in_nested_complex_selector = false; bool is_inside_visited_link = false; const ContainerNode* relative_leftmost_element = nullptr; - bool is_inside_has_pseudo_class = false; - bool pseudo_has_in_rightmost_compound = true; }; struct MatchResult { diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 34ff5f6f83e6b8..5dd9647be34a38 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc @@ -707,19 +707,6 @@ bool DisplayLockContext::MarkForCompositingUpdatesIfNeeded() { layout_box->Layer()->SetNeedsCompositingInputsUpdate(); needs_compositing_dependent_flag_update_ = false; - if (needs_graphics_layer_rebuild_) - layout_box->Layer()->SetNeedsGraphicsLayerRebuild(); - needs_graphics_layer_rebuild_ = false; - - if (forced_graphics_layer_update_blocked_) { - // If we don't have a compositing layer mapping ancestor in this frame, - // then mark this layer as needing a graphics layer rebuild, since what - // we want is to clear any dangling trees in this subtree or composite - // the frame again if something in the subtree still needs compositing. - layout_box->Layer()->SetNeedsGraphicsLayerRebuild(); - } - forced_graphics_layer_update_blocked_ = false; - return true; } return false; diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index d7a734309c5aeb..fab56547e81626 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h @@ -151,15 +151,6 @@ class CORE_EXPORT DisplayLockContext final needs_compositing_dependent_flag_update_ = true; } - void NotifyGraphicsLayerRebuildBlocked() { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - needs_graphics_layer_rebuild_ = true; - } - - void NotifyForcedGraphicsLayerUpdateBlocked() { - forced_graphics_layer_update_blocked_ = true; - } - // Notify this element will be disconnected. void NotifyWillDisconnect(); @@ -444,10 +435,6 @@ class CORE_EXPORT DisplayLockContext final // again at the start of the lifecycle. bool keep_unlocked_until_lifecycle_ = false; - bool needs_graphics_layer_rebuild_ = false; - - bool forced_graphics_layer_update_blocked_ = false; - // This is set to true if we're in the 'auto' mode and had our first // intersection / non-intersection notification. This is reset to false if the // 'auto' mode is added again (after being removed). diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc index e8693cf4828e92..9f2001592e3a79 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc @@ -31,7 +31,6 @@ #include "third_party/blink/renderer/core/geometry/dom_rect.h" #include "third_party/blink/renderer/core/html/html_template_element.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 6974ba265dbe9d..9ed29f10e3e7fb 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc @@ -281,7 +281,6 @@ #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h" #include "third_party/blink/renderer/core/page/validation_message_client.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -2664,16 +2663,6 @@ void Document::SetIsXrOverlay(bool val, Element* overlay_element) { // The DOM overlay may change the effective root element. Need to update // compositing inputs to avoid a mismatch in CompositingRequirementsUpdater. GetLayoutView()->Layer()->SetNeedsCompositingInputsUpdate(); - - // Ensure that the graphics layer tree gets fully rebuilt on changes, - // similar to HTMLVideoElement::DidEnterFullscreen(). This may not be - // strictly necessary if the compositing changes are based on visibility - // settings, but helps ensure consistency in case it's changed to - // detaching layers or re-rooting the graphics layer tree. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - auto* compositor = GetLayoutView()->Compositor(); - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } } void Document::ScheduleUseShadowTreeUpdate(SVGUseElement& element) { @@ -2805,8 +2794,6 @@ void Document::Shutdown() { if (GetFrame()->IsLocalRoot()) GetPage()->GetChromeClient().AttachRootLayer(nullptr, GetFrame()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - layout_view_->CleanUpCompositor(); MutationObserver::CleanSlotChangeList(*this); diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 6531f9b8d7720c..315e1d51e8141b 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -150,7 +150,6 @@ #include "third_party/blink/renderer/core/page/pointer_lock_controller.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/paint/paint_timing.h" #include "third_party/blink/renderer/core/paint/paint_timing_detector.h" diff --git a/third_party/blink/renderer/core/frame/frame_overlay_test.cc b/third_party/blink/renderer/core/frame/frame_overlay_test.cc index 1dda2cc2f7a4fb..6036152a649564 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay_test.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay_test.cc @@ -15,7 +15,6 @@ #include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/platform/graphics/color.h" #include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index fc47c47cc197a6..8816d7170a6f46 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc @@ -165,7 +165,6 @@ #include "third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h" #include "third_party/blink/renderer/core/page/pointer_lock_controller.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/object_painter.h" #include "third_party/blink/renderer/core/paint/paint_auto_dark_mode.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -1418,16 +1417,6 @@ String LocalFrame::GetLayerTreeAsTextForTesting(unsigned flags) const { std::unique_ptr layers; if (!(flags & kOutputAsLayerTree)) { layers = View()->CompositedLayersAsJSON(static_cast(flags)); - } else { - if (const auto* root_layer = - ContentLayoutObject()->Compositor()->RootGraphicsLayer()) { - if (flags & kLayerTreeIncludesAllLayers && IsMainFrame()) { - while (root_layer->Parent()) - root_layer = root_layer->Parent(); - } - layers = GraphicsLayerTreeAsJSON(root_layer, - static_cast(flags)); - } } return layers ? layers->ToPrettyJSONString() : String(); } diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 43ca630bafeb63..2aa486d38a9d76 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc @@ -130,7 +130,6 @@ #include "third_party/blink/renderer/core/page/validation_message_client.h" #include "third_party/blink/renderer/core/paint/block_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/cull_rect_updater.h" #include "third_party/blink/renderer/core/paint/frame_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" @@ -277,7 +276,6 @@ LocalFrameView::LocalFrameView(LocalFrame& frame, gfx::Rect frame_rect) target_state_(DocumentLifecycle::kUninitialized), suppress_adjust_view_size_(false), intersection_observation_state_(kNotNeeded), - needs_forced_compositing_update_(false), needs_focus_on_fragment_(false), main_thread_scrolling_reasons_(0), forced_layout_stack_depth_(0), @@ -1379,24 +1377,6 @@ void LocalFrameView::SetLayoutSizeFixedToFrameSize(bool is_fixed) { SetLayoutSizeInternal(Size()); } -void LocalFrameView::SetNeedsCompositingUpdate( - CompositingUpdateType update_type) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - if (!frame_->GetDocument() || !frame_->GetDocument()->IsActive()) - return; - if (auto* layout_view = GetLayoutView()) { - auto* compositor = layout_view->Compositor(); - compositor->SetNeedsCompositingUpdate(update_type); - // Even if the frame is throttlable, we may still need to decomposite it - // in response to a visibility change. - if (compositor->StaleInCompositingMode()) { - layout_view->Layer()->SetNeedsCompositingInputsUpdate(); - needs_forced_compositing_update_ = true; - } - } -} - ChromeClient* LocalFrameView::GetChromeClient() const { Page* page = GetFrame().GetPage(); if (!page) @@ -2578,30 +2558,26 @@ bool LocalFrameView::RunCompositingInputsLifecyclePhase( SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(), LocalFrameUkmAggregator::kCompositingInputs); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - layout_view->Compositor()->UpdateInputsIfNeededRecursive(target_state); - } else { - // TODO(pdr): This descendant dependent treewalk should be integrated into - // the prepaint tree walk. - { -#if DCHECK_IS_ON() - SetIsUpdatingDescendantDependentFlags(true); -#endif - ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { - frame_view.GetLayoutView()->Layer()->UpdateDescendantDependentFlags(); - frame_view.GetLayoutView()->CommitPendingSelection(); - }); + // TODO(pdr): This descendant dependent treewalk should be integrated into + // the prepaint tree walk. + { #if DCHECK_IS_ON() - SetIsUpdatingDescendantDependentFlags(false); + SetIsUpdatingDescendantDependentFlags(true); #endif - } - ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { - frame_view.Lifecycle().AdvanceTo( - DocumentLifecycle::kCompositingInputsClean); + frame_view.GetLayoutView()->Layer()->UpdateDescendantDependentFlags(); + frame_view.GetLayoutView()->CommitPendingSelection(); }); +#if DCHECK_IS_ON() + SetIsUpdatingDescendantDependentFlags(false); +#endif } + ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { + frame_view.Lifecycle().AdvanceTo( + DocumentLifecycle::kCompositingInputsClean); + }); + return target_state > DocumentLifecycle::kCompositingInputsClean; } @@ -2612,16 +2588,10 @@ bool LocalFrameView::RunCompositingAssignmentsLifecyclePhase( auto* layout_view = GetLayoutView(); DCHECK(layout_view); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(), - LocalFrameUkmAggregator::kCompositingAssignments); - layout_view->Compositor()->UpdateAssignmentsIfNeededRecursive(target_state); - } else { - ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { - frame_view.Lifecycle().AdvanceTo( - DocumentLifecycle::kCompositingAssignmentsClean); - }); - } + ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { + frame_view.Lifecycle().AdvanceTo( + DocumentLifecycle::kCompositingAssignmentsClean); + }); frame_->GetPage()->GetValidationMessageClient().UpdatePrePaint(); ForAllNonThrottledLocalFrameViews([](LocalFrameView& view) { @@ -3595,9 +3565,6 @@ void LocalFrameView::SetTracksRasterInvalidations( track_raster_invalidations); } - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && GetLayoutView()) - GetLayoutView()->Compositor()->UpdateTrackingRasterInvalidations(); - TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "LocalFrameView::setTracksPaintInvalidations", TRACE_EVENT_SCOPE_GLOBAL, "enabled", @@ -4023,18 +3990,7 @@ static bool PaintOutsideOfLifecycleIsAllowed(GraphicsContext& context, // explicitly skip cache. if (context.GetPaintController().IsSkippingCache()) return true; - // For CompositeAfterPaint, they always conflict because we always paint into - // paint_controller_ during lifecycle update. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return false; - // For pre-CompositeAfterPaint, they conflict if the local frame root has a - // a root graphics layer. - return !frame_view.GetFrame() - .LocalFrameRoot() - .View() - ->GetLayoutView() - ->Compositor() - ->PaintRootGraphicsLayer(); + return false; } void LocalFrameView::PaintOutsideOfLifecycle( @@ -4191,10 +4147,6 @@ gfx::PointF LocalFrameView::ConvertFromRootFrame( } void LocalFrameView::ParentVisibleChanged() { - // As parent visibility changes, we may need to recomposite this frame view - // and potentially child frame views. - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - if (!IsSelfVisible()) return; @@ -4215,7 +4167,6 @@ void LocalFrameView::SelfVisibleChanged() { void LocalFrameView::Show() { if (!IsSelfVisible()) { SetSelfVisible(true); - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); if (IsParentVisible()) { ForAllChildViewsAndPlugins( [](EmbeddedContentView& embedded_content_view) { @@ -4234,7 +4185,6 @@ void LocalFrameView::Hide() { }); } SetSelfVisible(false); - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); } } @@ -4428,12 +4378,6 @@ void LocalFrameView::RenderThrottlingStatusChanged() { #endif } -void LocalFrameView::SetNeedsForcedCompositingUpdate() { - needs_forced_compositing_update_ = true; - if (LocalFrameView* parent = ParentFrameView()) - parent->SetNeedsForcedCompositingUpdate(); -} - void LocalFrameView::SetIntersectionObservationState( IntersectionObservationState state) { if (intersection_observation_state_ >= state) @@ -4514,7 +4458,7 @@ bool LocalFrameView::ShouldThrottleRendering() const { bool throttled_for_global_reasons = LocalFrameTreeAllowsThrottling() && CanThrottleRendering() && frame_->GetDocument(); - if (!throttled_for_global_reasons || needs_forced_compositing_update_) + if (!throttled_for_global_reasons) return false; // If we're currently running a lifecycle update, and we are required to run @@ -4981,12 +4925,6 @@ void LocalFrameView::RunPaintBenchmark(int repeat_count, result.painter_memory_usage += paint_artifact_compositor_->ApproximateUnsharedMemoryUsage(); } - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - if (auto* root = GetLayoutView()->Compositor()->PaintRootGraphicsLayer()) { - result.painter_memory_usage += - root->ApproximateUnsharedMemoryUsageRecursive(); - } - } } DarkModeFilter& LocalFrameView::EnsureDarkModeFilter() { diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index b1ec7c73b7ced7..85bbefe18b935d 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h @@ -44,7 +44,6 @@ #include "third_party/blink/renderer/core/frame/sticky_ad_detector.h" #include "third_party/blink/renderer/core/layout/depth_ordered_layout_object_list.h" #include "third_party/blink/renderer/core/layout/hit_test_result.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_update_type.h" #include "third_party/blink/renderer/core/paint/layout_object_counter.h" #include "third_party/blink/renderer/platform/geometry/layout_size.h" #include "third_party/blink/renderer/platform/graphics/color.h" @@ -239,13 +238,6 @@ class CORE_EXPORT LocalFrameView final void SetPaintArtifactCompositorNeedsUpdate(); - // Marks this frame, and ancestor frames, as needing a mandatory compositing - // update. This overrides throttling for one frame, up to kCompositingClean. - void SetNeedsForcedCompositingUpdate(); - void ResetNeedsForcedCompositingUpdate() { - needs_forced_compositing_update_ = false; - } - // Methods for getting/setting the size Blink should use to layout the // contents. gfx::Size GetLayoutSize() const { return layout_size_; } @@ -930,8 +922,6 @@ class CORE_EXPORT LocalFrameView final void UpdatePluginsTimerFired(TimerBase*); bool UpdatePlugins(); - void SetNeedsCompositingUpdate(CompositingUpdateType); - AXObjectCache* ExistingAXObjectCache() const; void SetLayoutSizeInternal(const gfx::Size&); @@ -1119,7 +1109,6 @@ class CORE_EXPORT LocalFrameView final bool allows_layout_invalidation_after_layout_clean_ = true; #endif IntersectionObservationState intersection_observation_state_; - bool needs_forced_compositing_update_; bool needs_focus_on_fragment_; diff --git a/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc b/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc index 2041f4daa0fb12..7981cd09da19a3 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc @@ -696,12 +696,7 @@ void HTMLSelectMenuElement::OptionPartRemoved(HTMLOptionElement* option_part) { option_parts_.erase(option_part); if (selected_option_ == option_part) { - // TODO(crbug.com/1121840) We should match the behavior from - // https://html.spec.whatwg.org/C/#ask-for-a-reset - // If the currently selected option was removed change the - // selection to the first option part, if there is one. - auto* first_option_part = FirstOptionPart(); - SetSelectedOption(first_option_part); + ResetToDefaultSelection(); } SetNeedsValidityCheck(); } @@ -727,12 +722,7 @@ void HTMLSelectMenuElement::OptionSelectionStateChanged( if (option_is_selected) { SetSelectedOption(option); } else if (SelectedOption() == option) { - // TODO(crbug.com/1121840) We should match the behavior from - // https://html.spec.whatwg.org/C/#ask-for-a-reset - // If the currently selected option was removed change the - // selection to the first option part, if there is one. - auto* first_option_part = FirstOptionPart(); - SetSelectedOption(first_option_part); + ResetToDefaultSelection(); } } @@ -932,6 +922,10 @@ bool HTMLSelectMenuElement::IsOptionalFormControl() const { return !IsRequiredFormControl(); } +bool HTMLSelectMenuElement::IsLabelable() const { + return true; +} + bool HTMLSelectMenuElement::ValueMissing() const { if (!IsRequired()) return false; @@ -946,6 +940,47 @@ bool HTMLSelectMenuElement::ValueMissing() const { return true; } +// https://html.spec.whatwg.org/C/#ask-for-a-reset +void HTMLSelectMenuElement::ResetImpl() { + for (auto& option : option_parts_) { + option->SetSelectedState( + option->FastHasAttribute(html_names::kSelectedAttr)); + option->SetDirty(false); + } + ResetToDefaultSelection(); + SetNeedsValidityCheck(); +} + +void HTMLSelectMenuElement::ResetToDefaultSelection() { + HTMLOptionElement* first_enabled_option = nullptr; + HTMLOptionElement* last_selected_option = nullptr; + + for (Node* node = SelectMenuPartTraversal::FirstChild(*this); node; + node = SelectMenuPartTraversal::Next(*node, this)) { + if (IsValidOptionPart(node, /*show_warning=*/false)) { + auto* option = DynamicTo(node); + if (option->Selected()) { + if (last_selected_option) { + last_selected_option->SetSelectedState(false); + } + last_selected_option = option; + } + if (!first_enabled_option && !option->IsDisabledFormControl()) { + first_enabled_option = option; + } + } + } + + // If no option is selected, set the selection to the first non-disabled + // option if it exists, or null otherwise. If two or more options are + // selected, set the selection to the last selected option. + if (last_selected_option) { + SetSelectedOption(last_selected_option); + } else { + SetSelectedOption(first_enabled_option); + } +} + String HTMLSelectMenuElement::validationMessage() const { if (!willValidate()) return String(); diff --git a/third_party/blink/renderer/core/html/forms/html_select_menu_element.h b/third_party/blink/renderer/core/html/forms/html_select_menu_element.h index 0d0e1fc39a9131..75e0d69ff9b7d6 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_menu_element.h +++ b/third_party/blink/renderer/core/html/forms/html_select_menu_element.h @@ -35,6 +35,8 @@ class CORE_EXPORT HTMLSelectMenuElement final String validationMessage() const override; bool ValueMissing() const override; + void ResetImpl() override; + void Trace(Visitor*) const override; enum class PartType { kNone, kButton, kListBox, kOption }; @@ -86,6 +88,7 @@ class CORE_EXPORT HTMLSelectMenuElement final void OptionPartInserted(HTMLOptionElement*); void OptionPartRemoved(HTMLOptionElement*); void ResetOptionParts(); + void ResetToDefaultSelection(); void DispatchInputAndChangeEventsIfNeeded(); void DispatchInputEvent(); void DispatchChangeEvent(); @@ -100,6 +103,8 @@ class CORE_EXPORT HTMLSelectMenuElement final bool IsRequiredFormControl() const override; bool IsOptionalFormControl() const override; + bool IsLabelable() const override; + // HTMLFormControlElementWithState overrides: const AtomicString& FormControlType() const override; bool MayTriggerVirtualKeyboard() const override; diff --git a/third_party/blink/renderer/core/html/forms/html_select_menu_element.idl b/third_party/blink/renderer/core/html/forms/html_select_menu_element.idl index f05586b67c12c9..50af073a60f194 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_menu_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_select_menu_element.idl @@ -22,4 +22,6 @@ interface HTMLSelectMenuElement : HTMLElement { boolean checkValidity(); boolean reportValidity(); void setCustomValidity(DOMString error); + + readonly attribute NodeList labels; }; diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index 8a9a66f0c3c27c..f8933bf390b556 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc @@ -108,7 +108,6 @@ #include "third_party/blink/renderer/core/loader/mixed_content_checker.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/peerconnection/execution_context_metronome_provider.h" #include "third_party/blink/renderer/platform/audio/audio_bus.h" #include "third_party/blink/renderer/platform/audio/audio_source_provider_client.h" diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc index 3d687aeb357474..e28e76ccc19be6 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.cc +++ b/third_party/blink/renderer/core/html/media/html_video_element.cc @@ -86,7 +86,6 @@ HTMLVideoElement::HTMLVideoElement(Document& document) picture_in_picture_interstitial_(nullptr), is_persistent_(false), is_auto_picture_in_picture_(false), - in_overlay_fullscreen_video_(false), is_effectively_fullscreen_(false), is_default_overridden_intrinsic_size_( !document.IsMediaDocument() && GetExecutionContext() && @@ -448,15 +447,6 @@ void HTMLVideoElement::DidEnterFullscreen() { GetWebMediaPlayer()->EnteredFullscreen(); GetWebMediaPlayer()->OnDisplayTypeChanged(GetDisplayType()); } - - // Cache this in case the player is destroyed before leaving fullscreen. - in_overlay_fullscreen_video_ = UsesOverlayFullscreenVideo(); - if (in_overlay_fullscreen_video_) { - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - auto* compositor = GetDocument().GetLayoutView()->Compositor(); - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - } } void HTMLVideoElement::DidExitFullscreen() { @@ -467,14 +457,6 @@ void HTMLVideoElement::DidExitFullscreen() { GetWebMediaPlayer()->OnDisplayTypeChanged(GetDisplayType()); } - if (in_overlay_fullscreen_video_) { - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - auto* compositor = GetDocument().GetLayoutView()->Compositor(); - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - } - in_overlay_fullscreen_video_ = false; - if (RuntimeEnabledFeatures::VideoAutoFullscreenEnabled() && !FastHasAttribute(html_names::kPlaysinlineAttr)) { pause(); diff --git a/third_party/blink/renderer/core/html/media/html_video_element.h b/third_party/blink/renderer/core/html/media/html_video_element.h index 35889bf0c99e40..efc71aaba36f9c 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.h +++ b/third_party/blink/renderer/core/html/media/html_video_element.h @@ -32,7 +32,6 @@ #include "third_party/blink/renderer/core/html/html_image_loader.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h" #include "third_party/blink/renderer/core/imagebitmap/image_bitmap_source.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" namespace blink { diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 57578004fa1fee..4288b8648648b6 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc @@ -100,7 +100,6 @@ #include "third_party/blink/renderer/core/paint/background_image_geometry.h" #include "third_party/blink/renderer/core/paint/box_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/box_painter.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/outline_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc index b62764547016f2..bce26b78bdd8fc 100644 --- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc +++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc @@ -42,7 +42,6 @@ #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h" #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -143,14 +142,6 @@ void LayoutBoxModelObject::WillBeDestroyed() { void LayoutBoxModelObject::StyleWillChange(StyleDifference diff, const ComputedStyle& new_style) { NOT_DESTROYED(); - // SPv1: - // This object's layer may begin or cease to be stacked or stacking context, - // in which case the paint invalidation container of this object and - // descendants may change. Thus we need to invalidate paint eagerly for all - // such children. PaintLayerCompositor::paintInvalidationOnCompositingChange() - // doesn't work for the case because we can only see the new - // paintInvalidationContainer during compositing update. - // SPv1 and v2: // Change of stacked/stacking context status may cause change of this or // descendant PaintLayer's CompositingContainer, so we need to eagerly // invalidate the current compositing container chain which may have painted diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.cc b/third_party/blink/renderer/core/layout/layout_embedded_content.cc index 3b1bbf64b34932..8bf7c1e8d8aae6 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.cc @@ -36,7 +36,6 @@ #include "third_party/blink/renderer/core/html/html_plugin_element.h" #include "third_party/blink/renderer/core/layout/hit_test_result.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/embedded_content_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "ui/gfx/geometry/point_conversions.h" @@ -112,15 +111,6 @@ PaintLayerType LayoutEmbeddedContent::LayerTypeRequired() const { return kForcedPaintLayer; } -bool LayoutEmbeddedContent::ContentDocumentContainsGraphicsLayer() const { - NOT_DESTROYED(); - if (PaintLayerCompositor* inner_compositor = - PaintLayerCompositor::FrameContentsCompositor(*this)) { - return inner_compositor->StaleInCompositingMode(); - } - return false; -} - bool LayoutEmbeddedContent::NodeAtPointOverEmbeddedContentView( HitTestResult& result, const HitTestLocation& hit_test_location, diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.h b/third_party/blink/renderer/core/layout/layout_embedded_content.h index 25d12d889f2027..5a00bbabd78b16 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.h +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.h @@ -43,8 +43,6 @@ class CORE_EXPORT LayoutEmbeddedContent : public LayoutReplaced { public: explicit LayoutEmbeddedContent(HTMLFrameOwnerElement*); - bool ContentDocumentContainsGraphicsLayer() const; - bool NodeAtPoint(HitTestResult&, const HitTestLocation&, const PhysicalOffset& accumulated_offset, diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc index 845fa0d39a09cc..28baecb831d691 100644 --- a/third_party/blink/renderer/core/layout/layout_view.cc +++ b/third_party/blink/renderer/core/layout/layout_view.cc @@ -51,7 +51,6 @@ #include "third_party/blink/renderer/core/page/named_pages_mapper.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/root_scroller_controller.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/paint/view_painter.h" @@ -102,9 +101,6 @@ LayoutView::LayoutView(ContainerNode* document) : LayoutBlockFlow(document), frame_view_(To(document)->View()), layout_state_(nullptr), - compositor_(RuntimeEnabledFeatures::CompositeAfterPaintEnabled() - ? nullptr - : MakeGarbageCollected(*this)), layout_quote_head_(nullptr), layout_counter_count_(0), hit_test_count_(0), @@ -132,7 +128,6 @@ LayoutView::~LayoutView() = default; void LayoutView::Trace(Visitor* visitor) const { visitor->Trace(frame_view_); visitor->Trace(fragmentation_context_); - visitor->Trace(compositor_); visitor->Trace(layout_quote_head_); visitor->Trace(hit_test_cache_); LayoutBlockFlow::Trace(visitor); @@ -846,17 +841,6 @@ void LayoutView::UpdateHitTestResult(HitTestResult& result, } } -PaintLayerCompositor* LayoutView::Compositor() { - NOT_DESTROYED(); - return compositor_; -} - -void LayoutView::CleanUpCompositor() { - NOT_DESTROYED(); - DCHECK(compositor_); - compositor_->CleanUp(); -} - IntervalArena* LayoutView::GetIntervalArena() { NOT_DESTROYED(); if (!interval_arena_) @@ -884,7 +868,6 @@ void LayoutView::WillBeDestroyed() { if (PaintLayer* layer = Layer()) layer->SetNeedsRepaint(); LayoutBlockFlow::WillBeDestroyed(); - compositor_.Clear(); } void LayoutView::UpdateFromStyle() { diff --git a/third_party/blink/renderer/core/layout/layout_view.h b/third_party/blink/renderer/core/layout/layout_view.h index 325fb9e03ca1b0..b6101303145e82 100644 --- a/third_party/blink/renderer/core/layout/layout_view.h +++ b/third_party/blink/renderer/core/layout/layout_view.h @@ -42,7 +42,6 @@ namespace blink { class LayoutQuote; class LocalFrameView; class NamedPagesMapper; -class PaintLayerCompositor; class ViewFragmentationContext; // LayoutView is the root of the layout tree and the Document's LayoutObject. @@ -69,10 +68,6 @@ class CORE_EXPORT LayoutView : public LayoutBlockFlow { void WillBeDestroyed() override; - // Called when the Document is shutdown, to have the compositor clean up - // during frame detach, while pointers remain valid. - void CleanUpCompositor(); - // hitTest() will update layout, style and compositing first while // hitTestNoLifecycleUpdate() does not. bool HitTest(const HitTestLocation& location, HitTestResult&); @@ -229,8 +224,6 @@ class CORE_EXPORT LayoutView : public LayoutBlockFlow { return named_pages_mapper_.get(); } - PaintLayerCompositor* Compositor(); - PhysicalRect DocumentRect() const; IntervalArena* GetIntervalArena(); @@ -398,7 +391,6 @@ class CORE_EXPORT LayoutView : public LayoutBlockFlow { Member fragmentation_context_; std::unique_ptr named_pages_mapper_; - Member compositor_; scoped_refptr interval_arena_; Member layout_quote_head_; diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 8a40af1bf0e774..0dc7a42614326e 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc @@ -1917,6 +1917,9 @@ void NGBlockNode::UpdateShapeOutsideInfoIfNeeded( if (!box_->IsFloating() || !box_->GetShapeOutsideInfo()) return; + if (layout_result.Status() != NGLayoutResult::kSuccess) + return; + // The box_ may not have a valid size yet (due to an intermediate layout), // use the fragment's size instead. LayoutSize box_size = layout_result.PhysicalFragment().Size().ToLayoutSize(); diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 3b8b4473d39ef4..1b595083369f26 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc @@ -326,6 +326,9 @@ void NGOutOfFlowLayoutPart::HandleFragmentation() { has_block_fragmentation_) return; + // Don't use the cache if we are handling fragmentation. + allow_first_tier_oof_cache_ = false; + while (container_builder_->HasOutOfFlowFragmentainerDescendants() || container_builder_->HasMulticolsWithPendingOOFs()) { HandleMulticolsWithPendingOOFs(container_builder_); diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc index 88d056956fc0ee..5dd99926e8d8fb 100644 --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc @@ -77,7 +77,6 @@ #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h" #include "third_party/blink/renderer/core/page/validation_message_client_impl.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" @@ -856,18 +855,13 @@ void Page::UpdateAcceleratedCompositingSettings() { auto* local_frame = DynamicTo(frame); if (!local_frame) continue; - LayoutView* layout_view = local_frame->ContentLayoutObject(); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - layout_view->Compositor()->UpdateAcceleratedCompositingSettings(); - } else { - // Mark all scrollable areas as needing a paint property update because - // the compositing reasons may have changed. - if (const auto* areas = local_frame->View()->ScrollableAreas()) { - for (const auto& scrollable_area : *areas) { - if (scrollable_area->ScrollsOverflow()) { - if (auto* layout_box = scrollable_area->GetLayoutBox()) - layout_box->SetNeedsPaintPropertyUpdate(); - } + // Mark all scrollable areas as needing a paint property update because the + // compositing reasons may have changed. + if (const auto* areas = local_frame->View()->ScrollableAreas()) { + for (const auto& scrollable_area : *areas) { + if (scrollable_area->ScrollsOverflow()) { + if (auto* layout_box = scrollable_area->GetLayoutBox()) + layout_box->SetNeedsPaintPropertyUpdate(); } } } diff --git a/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc b/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc index c4ae15eebe4e8f..34e68dc539357a 100644 --- a/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc @@ -17,7 +17,6 @@ #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc index 70efa2d63a341e..0759879a67f350 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc @@ -19,7 +19,6 @@ #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scrollable_area.h" diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc index 89a788fde5e85d..6a4581c2e4369d 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc @@ -32,7 +32,6 @@ #include "third_party/blink/renderer/core/page/scrolling/root_scroller_controller.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc index fcc1bba64adec9..5e7b2802472b0f 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc @@ -45,7 +45,6 @@ #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scroll_animator_base.h" diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc index 6d569944fcf095..78ea22116f9767 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc @@ -57,7 +57,6 @@ #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" diff --git a/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc b/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc index 0f53761a3e6e33..9601d61673897d 100644 --- a/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc +++ b/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc @@ -17,7 +17,6 @@ #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/overscroll_controller.h" #include "third_party/blink/renderer/core/page/scrolling/viewport_scroll_callback.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scrollable_area.h" diff --git a/third_party/blink/renderer/core/paint/build.gni b/third_party/blink/renderer/core/paint/build.gni index 85026b6aa89e74..4de7fd1abfb865 100644 --- a/third_party/blink/renderer/core/paint/build.gni +++ b/third_party/blink/renderer/core/paint/build.gni @@ -38,20 +38,15 @@ blink_core_sources_paint = [ "compositing/composited_layer_mapping.h", "compositing/compositing_inputs_root.cc", "compositing/compositing_inputs_root.h", - "compositing/compositing_layer_assigner.cc", - "compositing/compositing_layer_assigner.h", "compositing/compositing_layer_property_updater.cc", "compositing/compositing_layer_property_updater.h", "compositing/compositing_reason_finder.cc", "compositing/compositing_reason_finder.h", "compositing/compositing_state.h", - "compositing/compositing_update_type.h", "compositing/graphics_layer_tree_builder.cc", "compositing/graphics_layer_tree_builder.h", "compositing/graphics_layer_updater.cc", "compositing/graphics_layer_updater.h", - "compositing/paint_layer_compositor.cc", - "compositing/paint_layer_compositor.h", "css_mask_painter.cc", "css_mask_painter.h", "cull_rect_updater.cc", diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 982fb666ad4ab5..3a6ae7b51e82eb 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc @@ -59,7 +59,6 @@ #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/sticky_position_scrolling_constraints.h" #include "third_party/blink/renderer/core/paint/clip_path_clipper.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/css_mask_painter.h" #include "third_party/blink/renderer/core/paint/frame_paint_timing.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" @@ -218,8 +217,6 @@ void CompositedLayerMapping::CreatePrimaryGraphicsLayer() { } void CompositedLayerMapping::UpdateCompositedBounds() { - DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingAssignmentsUpdate); // FIXME: if this is really needed for performance, it would be better to // store it on Layer. composited_bounds_ = owning_layer_->BoundingBoxForCompositing(); @@ -227,24 +224,16 @@ void CompositedLayerMapping::UpdateCompositedBounds() { bool CompositedLayerMapping::UpdateGraphicsLayerConfiguration( const PaintLayer* compositing_container) { - DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingAssignmentsUpdate); - // Note carefully: here we assume that the compositing state of all // descendants have been updated already, so it is legitimate to compute and // cache the composited bounds for this layer. UpdateCompositedBounds(); - PaintLayerCompositor* compositor = Compositor(); LayoutObject& layout_object = GetLayoutObject(); const ComputedStyle& style = layout_object.StyleRef(); bool layer_config_changed = false; - if (UpdateForegroundLayer( - compositor->NeedsContentsCompositingLayer(owning_layer_))) - layer_config_changed = true; - // If the outline needs to draw over the composited scrolling contents layer // or scrollbar layers (or video or webgl) it needs to be drawn into a // separate layer. @@ -552,9 +541,6 @@ void CompositedLayerMapping::UpdateSquashingLayerGeometry( void CompositedLayerMapping::UpdateGraphicsLayerGeometry( const PaintLayer* compositing_container, HeapVector>& layers_needing_paint_invalidation) { - DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingAssignmentsUpdate); - gfx::Rect local_compositing_bounds; gfx::Point snapped_offset_from_composited_ancestor; ComputeBoundsOfOwningLayer(compositing_container, local_compositing_bounds, @@ -1196,9 +1182,6 @@ GraphicsLayerUpdater::UpdateType CompositedLayerMapping::UpdateTypeForChildren( GraphicsLayer* CompositedLayerMapping::SquashingLayer( const PaintLayer& squashed_layer) const { -#if DCHECK_IS_ON() - AssertInSquashedLayersVector(squashed_layer); -#endif DCHECK(NonScrollingSquashingLayer()); return NonScrollingSquashingLayer(); } @@ -1609,8 +1592,6 @@ bool CompositedLayerMapping::UpdateSquashingLayerAssignmentInternal( } else { squashed_layers.push_back(paint_info); } - // Must invalidate before adding the squashed layer to the mapping. - Compositor()->PaintInvalidationOnCompositingChange(&squashed_layer); return true; } @@ -1645,26 +1626,6 @@ void CompositedLayerMapping::RemoveLayerFromSquashingGraphicsLayer( NOTREACHED(); } -static bool LayerInSquashedLayersVector( - const HeapVector>& squashed_layers, - const PaintLayer& layer) { - for (auto& squashed_layer : squashed_layers) { - if (squashed_layer->paint_layer == &layer) - return true; - } - return false; -} - -#if DCHECK_IS_ON() -void CompositedLayerMapping::AssertInSquashedLayersVector( - const PaintLayer& squashed_layer) const { - auto* in = &non_scrolling_squashed_layers_; - auto* out = &squashed_layers_in_scrolling_contents_; - DCHECK(LayerInSquashedLayersVector(*in, squashed_layer)); - DCHECK(!LayerInSquashedLayersVector(*out, squashed_layer)); -} -#endif - static void RemoveExtraSquashedLayers( HeapVector>& squashed_layers, wtf_size_t new_count, @@ -1683,26 +1644,12 @@ void CompositedLayerMapping::FinishAccumulatingSquashingLayers( wtf_size_t new_non_scrolling_squashed_layer_count, wtf_size_t new_squashed_layer_in_scrolling_contents_count, HeapVector>& layers_needing_paint_invalidation) { - wtf_size_t first_removed_layer = layers_needing_paint_invalidation.size(); RemoveExtraSquashedLayers(non_scrolling_squashed_layers_, new_non_scrolling_squashed_layer_count, layers_needing_paint_invalidation); RemoveExtraSquashedLayers(squashed_layers_in_scrolling_contents_, new_squashed_layer_in_scrolling_contents_count, layers_needing_paint_invalidation); - for (auto i = first_removed_layer; - i < layers_needing_paint_invalidation.size(); i++) { - PaintLayer* layer = layers_needing_paint_invalidation[i]; - // Deal with layers that are no longer squashed. Need to check both - // vectors to exclude the layers that are still squashed. A layer may - // change from scrolling to non-scrolling or vice versa and still be - // squashed. - if (!LayerInSquashedLayersVector(non_scrolling_squashed_layers_, *layer) && - !LayerInSquashedLayersVector(squashed_layers_in_scrolling_contents_, - *layer)) { - Compositor()->PaintInvalidationOnCompositingChange(layer); - } - } } String CompositedLayerMapping::DebugName( diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index c4c47db3df14b1..9b3192524ddaa6 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h @@ -40,8 +40,6 @@ namespace blink { -class PaintLayerCompositor; - // A GraphicsLayerPaintInfo contains all the info needed to paint a partial // subtree of Layers into a GraphicsLayer. struct GraphicsLayerPaintInfo @@ -298,9 +296,6 @@ class CORE_EXPORT CompositedLayerMapping final LayoutBoxModelObject& GetLayoutObject() const { return owning_layer_->GetLayoutObject(); } - PaintLayerCompositor* Compositor() const { - return owning_layer_->Compositor(); - } void UpdateInternalHierarchy(); void UpdatePaintingPhases(); diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc b/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc deleted file mode 100644 index 67e785e18220ac..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2014 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h" - -#include "third_party/blink/renderer/core/animation/scroll_timeline.h" -#include "third_party/blink/renderer/core/animation/worklet_animation_controller.h" -#include "third_party/blink/renderer/core/layout/layout_embedded_content.h" -#include "third_party/blink/renderer/core/layout/layout_video.h" -#include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/paint_layer_paint_order_iterator.h" -#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" - -namespace blink { - -// We will only allow squashing if the bbox-area:squashed-area doesn't exceed -// the ratio |kSquashingSparsityTolerance|:1. -constexpr uint64_t kSquashingSparsityTolerance = 6; - -CompositingLayerAssigner::CompositingLayerAssigner( - PaintLayerCompositor* compositor) - : compositor_(compositor), layers_changed_(false) {} - -void CompositingLayerAssigner::Assign( - PaintLayer* update_root, - HeapVector>& layers_needing_paint_invalidation) { - TRACE_EVENT0("blink", "CompositingLayerAssigner::assign"); - - // TODO(pdr): Remove this. -} - -void CompositingLayerAssigner::SquashingState:: - UpdateSquashingStateForNewMapping( - CompositedLayerMapping* new_composited_layer_mapping, - HeapVector>& layers_needing_paint_invalidation) { - // The most recent backing is done accumulating any more squashing layers. - if (most_recent_mapping) { - most_recent_mapping->FinishAccumulatingSquashingLayers( - next_non_scrolling_squashed_layer_index, - next_squashed_layer_in_scrolling_contents_index, - layers_needing_paint_invalidation); - } - - next_non_scrolling_squashed_layer_index = 0; - next_squashed_layer_in_scrolling_contents_index = 0; - bounding_rect = gfx::Rect(); - most_recent_mapping = new_composited_layer_mapping; - have_assigned_backings_to_entire_squashing_layer_subtree = false; - // We may squash layers with CompositingReason::kOverflowScrollingParent into - // scrolling contents. These layers are stacked, and scrolled by a - // non-stacking-context scroller. See CompositingReasonFinder. - next_layer_may_squash_into_scrolling_contents = - most_recent_mapping && - most_recent_mapping->OwningLayer().NeedsCompositedScrolling() && - !most_recent_mapping->OwningLayer() - .GetLayoutObject() - .IsStackingContext(); -} - -bool CompositingLayerAssigner::SquashingWouldExceedSparsityTolerance( - const PaintLayer* candidate, - const CompositingLayerAssigner::SquashingState& squashing_state) { - gfx::Rect bounds = candidate->ClippedAbsoluteBoundingBox(); - gfx::Rect new_bounding_rect = squashing_state.bounding_rect; - new_bounding_rect.Union(bounds); - const uint64_t new_bounding_rect_area = new_bounding_rect.size().Area64(); - const uint64_t new_squashed_area = - squashing_state.total_area_of_squashed_rects + bounds.size().Area64(); - return new_bounding_rect_area > - kSquashingSparsityTolerance * new_squashed_area; -} - -bool CompositingLayerAssigner::NeedsOwnBacking(const PaintLayer* layer) const { - if (!layer->CanBeComposited()) - return false; - - return RequiresCompositing(layer->GetCompositingReasons()) || - (compositor_->StaleInCompositingMode() && layer->IsRootLayer()); -} - -CompositingStateTransitionType -CompositingLayerAssigner::ComputeCompositedLayerUpdate(PaintLayer* layer) { - CompositingStateTransitionType update = kNoCompositingStateChange; - if (NeedsOwnBacking(layer)) { - if (!layer->HasCompositedLayerMapping()) { - update = kAllocateOwnCompositedLayerMapping; - } - } else { - if (layer->HasCompositedLayerMapping()) - update = kRemoveOwnCompositedLayerMapping; - - if (!layer->SubtreeIsInvisible() && layer->CanBeComposited() && - RequiresSquashing(layer->GetCompositingReasons())) { - // We can't compute at this time whether the squashing layer update is a - // no-op, since that requires walking the paint layer tree. - update = kPutInSquashingLayer; - } - } - return update; -} - -static unsigned GetRenderingContextId(const PaintLayer* layer) { - const auto& fragment = layer->GetLayoutObject().PrimaryStitchingFragment(); - DCHECK(fragment.HasLocalBorderBoxProperties()); - return fragment.LocalBorderBoxProperties() - .Transform() - .Unalias() - .RenderingContextId(); -} - -SquashingDisallowedReasons -CompositingLayerAssigner::GetReasonsPreventingSquashing( - const PaintLayer* layer, - const CompositingLayerAssigner::SquashingState& squashing_state) { - if (RuntimeEnabledFeatures::DisableLayerSquashingEnabled()) - return SquashingDisallowedReason::kDisabled; - - if (!squashing_state.have_assigned_backings_to_entire_squashing_layer_subtree) - return SquashingDisallowedReason::kWouldBreakPaintOrder; - - DCHECK(squashing_state.most_recent_mapping); - const PaintLayer& squashing_layer = - squashing_state.most_recent_mapping->OwningLayer(); - - if (IsA(layer->GetLayoutObject()) || - IsA(squashing_layer.GetLayoutObject())) - return SquashingDisallowedReason::kSquashingVideoIsDisallowed; - - // Don't squash iframes, frames or plugins. - // FIXME: this is only necessary because there is frame code that assumes that - // composited frames are not squashed. - if (layer->GetLayoutObject().IsLayoutEmbeddedContent() || - squashing_layer.GetLayoutObject().IsLayoutEmbeddedContent()) { - return SquashingDisallowedReason:: - kSquashingLayoutEmbeddedContentIsDisallowed; - } - - // The layer may squash into scrolling contents if the squashing layer allows, - // and it's scrolled and clipped by the squashing layer. - bool may_squash_into_scrolling_contents = - squashing_state.next_layer_may_squash_into_scrolling_contents && - layer->AncestorScrollingLayer() == &squashing_layer && - layer->ClippingContainer() == &squashing_layer.GetLayoutObject(); - if (!may_squash_into_scrolling_contents) { - if (SquashingWouldExceedSparsityTolerance(layer, squashing_state)) - return SquashingDisallowedReason::kSquashingSparsityExceeded; - - if (layer->ClippingContainer() != squashing_layer.ClippingContainer() && - !squashing_layer.GetCompositedLayerMapping() - ->ContainingSquashedLayerInSquashingLayer( - layer->ClippingContainer(), - squashing_state.next_non_scrolling_squashed_layer_index)) - return SquashingDisallowedReason::kClippingContainerMismatch; - - if (layer->ScrollsWithRespectTo(&squashing_layer)) - return SquashingDisallowedReason::kScrollsWithRespectToSquashingLayer; - } - - if (layer->GetLayoutObject().StyleRef().HasBlendMode() || - squashing_layer.GetLayoutObject().StyleRef().HasBlendMode()) - return SquashingDisallowedReason::kSquashingBlendingIsDisallowed; - - if (layer->OpacityAncestor() != squashing_layer.OpacityAncestor()) - return SquashingDisallowedReason::kOpacityAncestorMismatch; - - if (layer->TransformAncestor() != squashing_layer.TransformAncestor()) - return SquashingDisallowedReason::kTransformAncestorMismatch; - - // A PaintLayer can generate multiple compositor layers that have - // *different* sorting contexts (because they point to different - // TransformTree nodes). We are only checking one here, which will not be - // accurate in all cases. - if (GetRenderingContextId(layer) != GetRenderingContextId(&squashing_layer)) - return SquashingDisallowedReason::kPreserve3DSortingContextMismatch; - - if (layer->HasFilterInducingProperty() || - layer->FilterAncestor() != squashing_layer.FilterAncestor()) - return SquashingDisallowedReason::kFilterMismatch; - - if (layer->NearestFixedPositionLayer() != - squashing_layer.NearestFixedPositionLayer()) - return SquashingDisallowedReason::kNearestFixedPositionMismatch; - DCHECK_NE(layer->GetLayoutObject().StyleRef().GetPosition(), - EPosition::kFixed); - - if ((squashing_layer.GetLayoutObject() - .StyleRef() - .SubtreeWillChangeContents() && - squashing_layer.GetLayoutObject() - .StyleRef() - .RequiresPropertyNodeForAnimation()) || - squashing_layer.GetLayoutObject() - .StyleRef() - .ShouldCompositeForCurrentAnimations()) - return SquashingDisallowedReason::kSquashingLayerIsAnimating; - - if (layer->EnclosingPaginationLayer()) - return SquashingDisallowedReason::kFragmentedContent; - - if (layer->GetLayoutObject().HasClipPath() || - layer->ClipPathAncestor() != squashing_layer.ClipPathAncestor()) - return SquashingDisallowedReason::kClipPathMismatch; - - if (layer->GetLayoutObject().HasMask() || - layer->MaskAncestor() != squashing_layer.MaskAncestor()) - return SquashingDisallowedReason::kMaskMismatch; - - if (layer->NearestContainedLayoutLayer() != - squashing_layer.NearestContainedLayoutLayer()) - return SquashingDisallowedReason::kCrossesLayoutContainmentBoundary; - - return SquashingDisallowedReason::kNone; -} - -void CompositingLayerAssigner::UpdateSquashingAssignment( - PaintLayer* layer, - SquashingState& squashing_state, - const CompositingStateTransitionType composited_layer_update, - HeapVector>& layers_needing_paint_invalidation) { - // NOTE: In the future as we generalize this, the background of this layer may - // need to be assigned to a different backing than the squashed PaintLayer's - // own primary contents. This would happen when we have a composited negative - // z-index element that needs to paint on top of the background, but below the - // layer's main contents. For now, because we always composite layers when - // they have a composited negative z-index child, such layers will never need - // squashing so it is not yet an issue. - if (composited_layer_update == kPutInSquashingLayer) { - // A layer that is squashed with other layers cannot have its own - // CompositedLayerMapping. - DCHECK(!layer->HasCompositedLayerMapping()); - DCHECK(squashing_state.most_recent_mapping); - - bool changed_squashing_layer = - squashing_state.most_recent_mapping->UpdateSquashingLayerAssignment( - *layer, squashing_state.next_non_scrolling_squashed_layer_index, - squashing_state.next_squashed_layer_in_scrolling_contents_index); - if (!changed_squashing_layer) - return; - - // If we've modified the collection of squashed layers, we must update - // the graphics layer geometry. - squashing_state.most_recent_mapping->SetNeedsGraphicsLayerUpdate( - kGraphicsLayerUpdateSubtree); - - // Issue a paint invalidation, since |layer| may have been added to an - // already-existing squashing layer. - layers_needing_paint_invalidation.push_back(layer); - layers_changed_ = true; - } else if (composited_layer_update == kRemoveFromSquashingLayer) { - if (layer->GroupedMapping()) { - // Before removing |layer| from an already-existing squashing layer that - // may have other content, issue a paint invalidation. - compositor_->PaintInvalidationOnCompositingChange(layer); - layer->GroupedMapping()->SetNeedsGraphicsLayerUpdate( - kGraphicsLayerUpdateSubtree); - } - - // If we need to issue paint invalidations, do so now that we've removed it - // from a squashed layer. - layers_needing_paint_invalidation.push_back(layer); - layers_changed_ = true; - } -} - -} // namespace blink diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h b/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h deleted file mode 100644 index ed5d82d4e4bd88..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2014 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_LAYER_ASSIGNER_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_LAYER_ASSIGNER_H_ - -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" -#include "third_party/blink/renderer/platform/geometry/layout_point.h" -#include "third_party/blink/renderer/platform/graphics/squashing_disallowed_reasons.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -#include "ui/gfx/geometry/rect.h" - -namespace blink { - -class CompositedLayerMapping; -class PaintLayer; - -class CompositingLayerAssigner { - STACK_ALLOCATED(); - - public: - explicit CompositingLayerAssigner(PaintLayerCompositor*); - - void Assign( - PaintLayer* update_root, - HeapVector>& layers_needing_paint_invalidation); - - bool LayersChanged() const { return layers_changed_; } - - // FIXME: This function should be private. We should remove the one caller - // once we've fixed the compositing chicken/egg issues. - CompositingStateTransitionType ComputeCompositedLayerUpdate(PaintLayer*); - - private: - struct SquashingState { - STACK_ALLOCATED(); - - public: - void UpdateSquashingStateForNewMapping( - CompositedLayerMapping*, - HeapVector>& layers_needing_paint_invalidation); - - // The most recent composited backing that the layer should squash onto if - // needed. - CompositedLayerMapping* most_recent_mapping = nullptr; - - // Whether all Layers in the stacking subtree rooted at the most recent - // mapping's owning layer have had CompositedLayerMappings assigned. Layers - // cannot squash into a CompositedLayerMapping owned by a stacking - // ancestor, since this changes paint order. - bool have_assigned_backings_to_entire_squashing_layer_subtree = false; - - // This is set to true when most_recent_mapping supports composited - // scrolling, and reset to false whenever any layer is not squashed into - // scrolling contents, to ensure all layers squashed into scrolling - // contents are continuous with the scroller in stacking order, without any - // other layer interlacing among them. - bool next_layer_may_squash_into_scrolling_contents = false; - - // Counter that tracks what index the next Layer would be if it gets - // squashed to the current non scrolling squashing layer. - wtf_size_t next_non_scrolling_squashed_layer_index = 0; - // Same as above but for layers squashed into scrolling contents layer. - wtf_size_t next_squashed_layer_in_scrolling_contents_index = 0; - - // The absolute bounding rect of all the squashed layers (not including - // those squashed into scrolling contents). - gfx::Rect bounding_rect; - - // This is simply the sum of the areas of the squashed rects. This can be - // very skewed if the rects overlap, but should be close enough to drive a - // heuristic (not including those squashed into scrolling contents). - uint64_t total_area_of_squashed_rects = 0; - }; - - void AssignLayersToBackingsInternal( - PaintLayer* layer, - PaintLayer* paint_invalidation_container, - SquashingState&, - HeapVector>& layers_needing_paint_invalidation); - SquashingDisallowedReasons GetReasonsPreventingSquashing( - const PaintLayer*, - const SquashingState&); - bool SquashingWouldExceedSparsityTolerance(const PaintLayer* candidate, - const SquashingState&); - void UpdateSquashingAssignment( - PaintLayer*, - SquashingState&, - CompositingStateTransitionType, - HeapVector>& layers_needing_paint_invalidation); - bool NeedsOwnBacking(const PaintLayer*) const; - - PaintLayerCompositor* compositor_; - bool layers_changed_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_LAYER_ASSIGNER_H_ diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_update_type.h b/third_party/blink/renderer/core/paint/compositing/compositing_update_type.h deleted file mode 100644 index 2ac368bfb89d08..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/compositing_update_type.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2009 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_UPDATE_TYPE_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_UPDATE_TYPE_H_ - -namespace blink { - -enum CompositingUpdateType { - kCompositingUpdateNone, - kCompositingUpdateAfterGeometryChange, - kCompositingUpdateAfterCompositingInputChange, - kCompositingUpdateRebuildTree, -}; - -} // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_UPDATE_TYPE_H_ diff --git a/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc b/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc index 71cf70ac3da366..e3e797ae82a7d4 100644 --- a/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc @@ -30,7 +30,6 @@ #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_paint_order_iterator.h" #include "third_party/blink/renderer/platform/heap/collection_support/clear_collection_scope.h" @@ -92,16 +91,6 @@ void GraphicsLayerTreeBuilder::RebuildRecursive( bool recursion_blocked_by_display_lock = layer.GetLayoutObject().ChildPrePaintBlockedByDisplayLock(); - // If the recursion is blocked meaningfully (i.e. we would have recursed, - // since the layer has children), then we should inform the display-lock - // context that we blocked a graphics layer recursion, so that we can ensure - // to rebuild the tree once we're unlocked. - if (recursion_blocked_by_display_lock && layer.FirstChild()) { - auto* context = layer.GetLayoutObject().GetDisplayLockContext(); - DCHECK(context); - context->NotifyGraphicsLayerRebuildBlocked(); - } - if (layer.IsStackingContextWithNegativeZOrderChildren()) { if (!recursion_blocked_by_display_lock) { PaintLayerPaintOrderIterator iterator(&layer, kNegativeZOrderChildren); @@ -127,23 +116,6 @@ void GraphicsLayerTreeBuilder::RebuildRecursive( RebuildRecursive(*child_layer, *layer_vector_for_children, *pending_reparents_for_children); } - - if (auto* embedded = - DynamicTo(layer.GetLayoutObject())) { - DCHECK(this_layer_children.IsEmpty()); - PaintLayerCompositor* inner_compositor = - PaintLayerCompositor::FrameContentsCompositor(*embedded); - if (inner_compositor) { - if (GraphicsLayer* inner_root_graphics_layer = - inner_compositor->RootGraphicsLayer()) { - // TODO(szager); Remove this after diagnosing crash - CHECK_EQ(inner_compositor->InCompositingMode(), - (bool)inner_root_graphics_layer); - layer_vector_for_children->push_back(inner_root_graphics_layer); - } - inner_compositor->ClearRootLayerAttachmentDirty(); - } - } } if (has_composited_layer_mapping) { diff --git a/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc b/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc index 1c8485e1284653..09bb3119511308 100644 --- a/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc +++ b/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc @@ -31,7 +31,6 @@ #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" #include "third_party/blink/renderer/core/paint/compositing/compositing_layer_property_updater.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" @@ -152,14 +151,6 @@ void GraphicsLayerUpdater::UpdateRecursive( if (first_child && layer.GetLayoutObject().ChildPrePaintBlockedByDisplayLock()) { first_child = nullptr; - - // If we have a forced update, we notify the display lock to ensure that the - // forced update resumes after the lock has been removed. - if (update_type == kForceUpdate) { - auto* child_context = layer.GetLayoutObject().GetDisplayLockContext(); - DCHECK(child_context); - child_context->NotifyForcedGraphicsLayerUpdateBlocked(); - } } UpdateContext child_context(context, layer); diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc deleted file mode 100644 index fcd49e79a35b4d..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" - -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/platform/platform.h" -#include "third_party/blink/renderer/core/animation/document_animations.h" -#include "third_party/blink/renderer/core/animation/document_timeline.h" -#include "third_party/blink/renderer/core/animation/element_animations.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" -#include "third_party/blink/renderer/core/dom/dom_node_ids.h" -#include "third_party/blink/renderer/core/editing/frame_selection.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/local_frame_client.h" -#include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/frame/settings.h" -#include "third_party/blink/renderer/core/fullscreen/fullscreen.h" -#include "third_party/blink/renderer/core/html/html_iframe_element.h" -#include "third_party/blink/renderer/core/layout/layout_embedded_content.h" -#include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/page/chrome_client.h" -#include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h" -#include "third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.h" -#include "third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.h" -#include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" -#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" -#include "third_party/blink/renderer/core/probe/core_probes.h" -#include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" -#include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h" -#include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h" -#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" -#include "ui/gfx/geometry/rect_f.h" - -namespace blink { - -PaintLayerCompositor::PaintLayerCompositor(LayoutView& layout_view) - : layout_view_(&layout_view) { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); -} - -PaintLayerCompositor::~PaintLayerCompositor() = default; - -void PaintLayerCompositor::CleanUp() { - if (InCompositingMode()) - SetOwnerNeedsCompositingInputsUpdate(); -} - -bool PaintLayerCompositor::InCompositingMode() const { - // FIXME: This should assert that lifecycle is >= CompositingClean since - // the last step of updateIfNeeded can set this bit to false. - return compositing_; -} - -bool PaintLayerCompositor::StaleInCompositingMode() const { - return compositing_; -} - -void PaintLayerCompositor::SetCompositingModeEnabled(bool enable) { - if (enable == compositing_) - return; - compositing_ = enable; -} - -void PaintLayerCompositor::UpdateAcceleratedCompositingSettings() { - if (auto* root_layer = RootLayer()) - root_layer->SetNeedsCompositingInputsUpdate(); -} - -void PaintLayerCompositor::UpdateInputsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state) { - DCHECK_GE(target_state, DocumentLifecycle::kCompositingInputsClean); - TRACE_EVENT0("blink,benchmark", - "PaintLayerCompositor::UpdateInputsIfNeededRecursive"); - UpdateInputsIfNeededRecursiveInternal(target_state); -} - -void PaintLayerCompositor::UpdateInputsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state) { - if (layout_view_->GetFrameView()->ShouldThrottleRendering()) { - return; - } - - Lifecycle().AdvanceTo(DocumentLifecycle::kInCompositingInputsUpdate); - - for (Frame* child = - layout_view_->GetFrameView()->GetFrame().Tree().FirstChild(); - child; child = child->Tree().NextSibling()) { - auto* local_frame = DynamicTo(child); - if (!local_frame) - continue; - // It's possible for trusted Pepper plugins to force hit testing in - // situations where the frame tree is in an inconsistent state, such as in - // the middle of frame detach. - // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. - if (local_frame->GetDocument()->IsActive() && - local_frame->ContentLayoutObject()) { - local_frame->ContentLayoutObject() - ->Compositor() - ->UpdateInputsIfNeededRecursiveInternal(target_state); - } - } - - ScriptForbiddenScope forbid_script; - -#if DCHECK_IS_ON() - LocalFrameView* view = layout_view_->GetFrameView(); - view->SetIsUpdatingDescendantDependentFlags(true); -#endif - { - TRACE_EVENT0("blink", "PaintLayer::UpdateDescendantDependentFlags"); - RootLayer()->UpdateDescendantDependentFlags(); - } -#if DCHECK_IS_ON() - view->SetIsUpdatingDescendantDependentFlags(false); -#endif - - layout_view_->CommitPendingSelection(); - - Lifecycle().AdvanceTo(DocumentLifecycle::kCompositingInputsClean); -} - -void PaintLayerCompositor::UpdateAssignmentsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state) { - DCHECK_GE(target_state, DocumentLifecycle::kCompositingAssignmentsClean); - UpdateAssignmentsIfNeededRecursiveInternal(target_state); -} - -void PaintLayerCompositor::UpdateAssignmentsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state) { - if (target_state == DocumentLifecycle::kCompositingInputsClean) - return; - - if (layout_view_->GetFrameView()->ShouldThrottleRendering()) - return; - - if (DisplayLockUtilities::PrePaintBlockedInParentFrame(layout_view_)) - return; - - Lifecycle().AdvanceTo(DocumentLifecycle::kInCompositingAssignmentsUpdate); - - for (Frame* child = - layout_view_->GetFrameView()->GetFrame().Tree().FirstChild(); - child; child = child->Tree().NextSibling()) { - auto* local_frame = DynamicTo(child); - if (!local_frame) - continue; - // It's possible for trusted Pepper plugins to force hit testing in - // situations where the frame tree is in an inconsistent state, such as in - // the middle of frame detach. - // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. - if (local_frame->GetDocument()->IsActive() && - local_frame->ContentLayoutObject()) { - auto* child_compositor = local_frame->ContentLayoutObject()->Compositor(); - child_compositor->UpdateAssignmentsIfNeededRecursiveInternal( - target_state); - if (child_compositor->root_layer_attachment_dirty_) - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - } - - TRACE_EVENT0("blink,benchmark", - "PaintLayerCompositor::UpdateAssignmentsIfNeededRecursive"); - - DCHECK(!layout_view_->NeedsLayout()); - - ScriptForbiddenScope forbid_script; - - UpdateAssignmentsIfNeeded(target_state); - - Lifecycle().AdvanceTo(DocumentLifecycle::kCompositingAssignmentsClean); - -#if DCHECK_IS_ON() - DCHECK_EQ(Lifecycle().GetState(), - DocumentLifecycle::kCompositingAssignmentsClean); - if (!DisplayLockUtilities::PrePaintBlockedInParentFrame(layout_view_)) - AssertNoUnresolvedDirtyBits(); - for (Frame* child = - layout_view_->GetFrameView()->GetFrame().Tree().FirstChild(); - child; child = child->Tree().NextSibling()) { - auto* local_frame = DynamicTo(child); - if (!local_frame) - continue; - if (local_frame->ShouldThrottleRendering() || - !local_frame->ContentLayoutObject() || - DisplayLockUtilities::PrePaintBlockedInParentFrame( - local_frame->ContentLayoutObject())) - continue; - local_frame->ContentLayoutObject() - ->Compositor() - ->AssertNoUnresolvedDirtyBits(); - } -#endif - - layout_view_->GetFrameView()->ResetNeedsForcedCompositingUpdate(); -} - -#if DCHECK_IS_ON() -void PaintLayerCompositor::AssertNoUnresolvedDirtyBits() { - DCHECK_EQ(pending_update_type_, kCompositingUpdateNone); -} -#endif - -void PaintLayerCompositor::SetNeedsCompositingUpdate( - CompositingUpdateType update_type) { - DCHECK_NE(update_type, kCompositingUpdateNone); - pending_update_type_ = std::max(pending_update_type_, update_type); - if (Page* page = GetPage()) - page->Animator().ScheduleVisualUpdate(layout_view_->GetFrame()); - - if (layout_view_->DocumentBeingDestroyed()) - return; -} - -#if DCHECK_IS_ON() -static void AssertWholeTreeNotComposited(const PaintLayer& paint_layer) { - DCHECK(paint_layer.GetCompositingState() == kNotComposited); - for (PaintLayer* child = paint_layer.FirstChild(); child; - child = child->NextSibling()) { - AssertWholeTreeNotComposited(*child); - } -} -#endif - -void PaintLayerCompositor::UpdateAssignmentsIfNeeded( - DocumentLifecycle::LifecycleState target_state) { - DCHECK(target_state >= DocumentLifecycle::kCompositingAssignmentsClean); - - CompositingUpdateType update_type = pending_update_type_; - pending_update_type_ = kCompositingUpdateNone; - - if (update_type == kCompositingUpdateNone) - return; - - PaintLayer* update_root = RootLayer(); - - HeapVector> layers_needing_paint_invalidation; - ClearCollectionScope>> scope( - &layers_needing_paint_invalidation); - - if (update_type >= kCompositingUpdateAfterCompositingInputChange) { - CompositingLayerAssigner layer_assigner(this); - layer_assigner.Assign(update_root, layers_needing_paint_invalidation); - // TODO(szager): Remove this after diagnosing crash. - CHECK_EQ(compositing_, (bool)RootGraphicsLayer()); - - if (layer_assigner.LayersChanged()) - update_type = std::max(update_type, kCompositingUpdateRebuildTree); - } - -#if DCHECK_IS_ON() - if (update_root->GetCompositingState() != kPaintsIntoOwnBacking) { - AssertWholeTreeNotComposited(*update_root); - } -#endif - - GraphicsLayerUpdater updater; - updater.Update(*update_root, layers_needing_paint_invalidation); - - if (updater.NeedsRebuildTree()) - update_type = std::max(update_type, kCompositingUpdateRebuildTree); - -#if DCHECK_IS_ON() - // FIXME: Move this check to the end of the compositing update. - GraphicsLayerUpdater::AssertNeedsToUpdateGraphicsLayerBitsCleared( - *update_root); -#endif - - if (update_type >= kCompositingUpdateRebuildTree) { - GraphicsLayerVector child_list; - { - TRACE_EVENT0("blink", "GraphicsLayerTreeBuilder::rebuild"); - GraphicsLayerTreeBuilder().Rebuild(*update_root, child_list); - } - - if (!child_list.IsEmpty()) { - CHECK(compositing_); - DCHECK_EQ(1u, child_list.size()); - root_layer_attachment_dirty_ = true; - } - } - - for (auto& layer : layers_needing_paint_invalidation) { - PaintInvalidationOnCompositingChange(layer); - } -} - -void PaintLayerCompositor::PaintInvalidationOnCompositingChange( - PaintLayer* layer) { - // If the layoutObject is not attached yet, no need to issue paint - // invalidations. - if (!layer->GetLayoutObject().IsLayoutView() && - !layer->GetLayoutObject().Parent()) - return; - - layer->SetNeedsRepaint(); - // We need to check for raster invalidations due to content changing - // composited layer backings. - switch (layer->GetCompositingState()) { - case kPaintsIntoOwnBacking: - layer->GetCompositedLayerMapping()->SetNeedsCheckRasterInvalidation(); - break; - case kPaintsIntoGroupedBacking: - layer->GroupedMapping()->SetNeedsCheckRasterInvalidation(); - break; - case kNotComposited: - break; - } -} - -PaintLayerCompositor* PaintLayerCompositor::FrameContentsCompositor( - const LayoutEmbeddedContent& layout_object) { - const auto* element = - DynamicTo(layout_object.GetNode()); - if (!element) - return nullptr; - - if (Document* content_document = element->contentDocument()) { - if (auto* view = content_document->GetLayoutView()) - return view->Compositor(); - } - return nullptr; -} - -PaintLayer* PaintLayerCompositor::RootLayer() const { - return layout_view_->Layer(); -} - -GraphicsLayer* PaintLayerCompositor::RootGraphicsLayer() const { - if (CompositedLayerMapping* clm = RootLayer()->GetCompositedLayerMapping()) - return clm->MainGraphicsLayer(); - return nullptr; -} - -GraphicsLayer* PaintLayerCompositor::PaintRootGraphicsLayer() const { - // Shortcut: skip the fullscreen checks for popups. - Document& doc = layout_view_->GetDocument(); - if (doc.GetPage()->GetChromeClient().IsPopup()) - return RootGraphicsLayer(); - - // Start from the full screen overlay layer if exists. Other layers will be - // skipped during painting. - if (PaintLayer* layer = - layout_view_->GetFrameView()->GetFullScreenOverlayLayer()) { - if (layer->HasCompositedLayerMapping()) - return layer->GetCompositedLayerMapping()->MainGraphicsLayer(); - } - - return RootGraphicsLayer(); -} - -// If an element has composited negative z-index children, those children paint -// in front of the layer background, so we need an extra 'contents' layer for -// the foreground of the layer object. -bool PaintLayerCompositor::NeedsContentsCompositingLayer( - const PaintLayer* layer) const { - return layer->IsStackingContextWithNegativeZOrderChildren(); -} - -static void UpdateTrackingRasterInvalidationsRecursive( - GraphicsLayer* graphics_layer) { - if (!graphics_layer) - return; - - graphics_layer->UpdateTrackingRasterInvalidations(); - - for (wtf_size_t i = 0; i < graphics_layer->Children().size(); ++i) - UpdateTrackingRasterInvalidationsRecursive(graphics_layer->Children()[i]); -} - -void PaintLayerCompositor::UpdateTrackingRasterInvalidations() { -#if DCHECK_IS_ON() - DCHECK(Lifecycle().GetState() == DocumentLifecycle::kPaintClean || - layout_view_->GetFrameView()->ShouldThrottleRendering()); -#endif - - if (GraphicsLayer* root_layer = PaintRootGraphicsLayer()) - UpdateTrackingRasterInvalidationsRecursive(root_layer); -} - -void PaintLayerCompositor::SetOwnerNeedsCompositingInputsUpdate() { - if (HTMLFrameOwnerElement* owner_element = - layout_view_->GetDocument().LocalOwner()) { - LayoutBoxModelObject* layout_object = - owner_element->GetLayoutBoxModelObject(); - if (!layout_object || !layout_object->HasLayer()) - return; - layout_object->Layer()->SetNeedsCompositingInputsUpdate(); - } -} - -Page* PaintLayerCompositor::GetPage() const { - return layout_view_->GetFrameView()->GetFrame().GetPage(); -} - -DocumentLifecycle& PaintLayerCompositor::Lifecycle() const { - return layout_view_->GetDocument().Lifecycle(); -} - -bool PaintLayerCompositor::IsMainFrame() const { - return layout_view_->GetFrame()->IsMainFrame(); -} - -void PaintLayerCompositor::Trace(Visitor* visitor) const { - visitor->Trace(layout_view_); - visitor->Trace(compositing_inputs_root_); -} - -} // namespace blink diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h deleted file mode 100644 index 2a19ab8b080974..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2009 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_PAINT_LAYER_COMPOSITOR_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_PAINT_LAYER_COMPOSITOR_H_ - -#include "base/dcheck_is_on.h" -#include "base/gtest_prod_util.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/dom/document_lifecycle.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_inputs_root.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_update_type.h" -#include "third_party/blink/renderer/platform/heap/handle.h" - -namespace blink { - -class PaintLayer; -class GraphicsLayer; -class LayoutEmbeddedContent; -class LayoutView; -class Page; -class Scrollbar; - -enum CompositingStateTransitionType { - kNoCompositingStateChange, - kAllocateOwnCompositedLayerMapping, - kRemoveOwnCompositedLayerMapping, - kPutInSquashingLayer, - kRemoveFromSquashingLayer -}; - -// PaintLayerCompositor maintains document-level compositing state and is the -// entry point of the "compositing update" lifecycle stage. There is one PLC -// per LayoutView. -// -// The compositing update, implemented by PaintLayerCompositor and friends, -// decides for each PaintLayer whether it should get a CompositedLayerMapping, -// and asks each CLM to set up its GraphicsLayers. -// -// With CompositeAfterPaint, PaintLayerCompositor will be eventually replaced by -// PaintArtifactCompositor. - -class CORE_EXPORT PaintLayerCompositor final - : public GarbageCollected { - public: - explicit PaintLayerCompositor(LayoutView&); - ~PaintLayerCompositor(); - - // Called while the LocalFrame behind the LayoutView is being detached. - // Pointers in other objects should be cleaned up at this point, before - // pointers out of this object become invalid. - void CleanUp(); - - void UpdateInputsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state); - void UpdateAssignmentsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state); - - // Return true if this LayoutView is in "compositing mode" (i.e. has one or - // more composited Layers) - bool InCompositingMode() const; - // FIXME: Replace all callers with inCompositingMode and remove this function. - bool StaleInCompositingMode() const; - // This will make a compositing layer at the root automatically, and hook up - // to the native view/window system. - void SetCompositingModeEnabled(bool); - - // Notifies about changes to PreferCompositingToLCDText or - // AcceleratedCompositing. - void UpdateAcceleratedCompositingSettings(); - - // Used to indicate that a compositing update will be needed for the next - // frame that gets drawn. If called from before the compositing inputs - // step has run, and the type is > kCompositingUpdateNone, compositing - // inputs will be re-computed. If called during pre-paint (which is after - // compositing inputs and before the rest of compositing), it will cause - // the rest of compositing to run, but not compositing inputs. - void SetNeedsCompositingUpdate(CompositingUpdateType); - - // Whether the given layer needs an extra 'contents' layer. - bool NeedsContentsCompositingLayer(const PaintLayer*) const; - - // Issue paint invalidations of the appropriate layers when the given Layer - // starts or stops being composited. - static void PaintInvalidationOnCompositingChange(PaintLayer*); - - PaintLayer* RootLayer() const; - - // The LayoutView's main GraphicsLayer. - GraphicsLayer* RootGraphicsLayer() const; - - // Returns the GraphicsLayer we should start painting from. This can differ - // from above in some cases, e.g. when the RootGraphicsLayer is detached and - // swapped out for an overlay video or immersive-ar DOM overlay layer. - GraphicsLayer* PaintRootGraphicsLayer() const; - - static PaintLayerCompositor* FrameContentsCompositor( - const LayoutEmbeddedContent&); - - void UpdateTrackingRasterInvalidations(); - - DocumentLifecycle& Lifecycle() const; - - void ClearRootLayerAttachmentDirty() { root_layer_attachment_dirty_ = false; } - - PaintLayer* GetCompositingInputsRoot() { - return compositing_inputs_root_.Get(); - } - - void ClearCompositingInputsRoot() { compositing_inputs_root_.Clear(); } - - void UpdateCompositingInputsRoot(PaintLayer* layer) { - compositing_inputs_root_.Update(layer); - } - - void Trace(Visitor*) const; - - private: -#if DCHECK_IS_ON() - void AssertNoUnresolvedDirtyBits(); -#endif - - void UpdateAssignmentsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state); - void UpdateInputsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state); - - void UpdateAssignmentsIfNeeded( - DocumentLifecycle::LifecycleState target_state); - - void SetOwnerNeedsCompositingInputsUpdate(); - - Page* GetPage() const; - - // Checks the given graphics layer against the compositor's horizontal and - // vertical scrollbar graphics layers, returning the associated Scrollbar - // instance if any, else nullptr. - Scrollbar* GraphicsLayerToScrollbar(const GraphicsLayer*) const; - - bool IsMainFrame() const; - - Member layout_view_; - - bool compositing_ = false; - bool root_layer_attachment_dirty_ = false; - - // After initialization, compositing updates must be done, so start dirty. - CompositingUpdateType pending_update_type_ = - kCompositingUpdateAfterCompositingInputChange; - - CompositingInputsRoot compositing_inputs_root_; - - FRIEND_TEST_ALL_PREFIXES(FrameThrottlingTest, - IntersectionObservationOverridesThrottling); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_PAINT_LAYER_COMPOSITOR_H_ diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index f95846392e519a..28f7ddfae07a88 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc @@ -76,7 +76,7 @@ #include "third_party/blink/renderer/core/paint/box_reflection_utils.h" #include "third_party/blink/renderer/core/paint/clip_path_clipper.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" +#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" #include "third_party/blink/renderer/core/paint/filter_effect_builder.h" #include "third_party/blink/renderer/core/paint/hit_testing_transform_state.h" #include "third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h" @@ -262,12 +262,6 @@ DOMNodeId PaintLayer::OwnerNodeId() const { return static_cast(GetLayoutObject()).OwnerNodeId(); } -PaintLayerCompositor* PaintLayer::Compositor() const { - if (!GetLayoutObject().View()) - return nullptr; - return GetLayoutObject().View()->Compositor(); -} - bool PaintLayer::PaintsWithFilters() const { if (!GetLayoutObject().HasFilterInducingProperty()) return false; @@ -995,11 +989,6 @@ void PaintLayer::SetNeedsCompositingInputsUpdate(bool mark_ancestor_flags) { MarkAncestorChainForFlagsUpdate(kNeedsDescendantDependentUpdate); } -void PaintLayer::SetNeedsGraphicsLayerRebuild() { - if (Compositor()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); -} - void PaintLayer::SetNeedsVisualOverflowRecalc() { DCHECK(IsSelfPaintingLayer()); #if DCHECK_IS_ON() @@ -1071,12 +1060,6 @@ void PaintLayer::AddChild(PaintLayer* child, PaintLayer* before_child) { SetNeedsCompositingInputsUpdate(); - if (Compositor()) { - if (!child->GetLayoutObject().IsStacked() && - !GetLayoutObject().DocumentBeingDestroyed()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - if (child->GetLayoutObject().IsStacked() || child->FirstChild()) { // Dirty the z-order list in which we are contained. The // ancestorStackingContextNode() can be null in the case where we're @@ -1120,13 +1103,6 @@ void PaintLayer::RemoveChild(PaintLayer* old_child) { last_ = old_child->PreviousSibling(); if (!GetLayoutObject().DocumentBeingDestroyed()) { - if (Compositor()) { - if (!old_child->GetLayoutObject().IsStacked()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - - if (Compositor()->GetCompositingInputsRoot() == old_child) - Compositor()->ClearCompositingInputsRoot(); - } // Dirty the z-order list in which we are contained. old_child->DirtyStackingContextZOrderLists(); SetNeedsCompositingInputsUpdate(); @@ -1171,27 +1147,7 @@ void PaintLayer::RemoveOnlyThisLayerAfterStyleChange( } } - bool did_set_paint_invalidation = false; - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // Destructing PaintLayer would cause CompositedLayerMapping and composited - // layers to be destructed and detach from layer tree immediately. Layers - // could have dangling scroll/clip parent if compositing update were - // omitted. - if (LocalFrameView* frame_view = layout_object_->GetDocument().View()) - frame_view->SetNeedsForcedCompositingUpdate(); - - if (IsPaintInvalidationContainer()) { - // Our children will be reparented and contained by a new paint - // invalidation container, so need paint invalidation. CompositingUpdate - // can't see this layer (which has been removed) so won't do this for us. - ObjectPaintInvalidator(GetLayoutObject()) - .InvalidatePaintIncludingNonCompositingDescendants(); - GetLayoutObject().SetSubtreeShouldDoFullPaintInvalidation(); - did_set_paint_invalidation = true; - } - } - - if (!did_set_paint_invalidation && IsSelfPaintingLayer()) { + if (IsSelfPaintingLayer()) { if (PaintLayer* enclosing_self_painting_layer = parent_->EnclosingSelfPaintingLayer()) enclosing_self_painting_layer->MergeNeedsPaintPhaseFlagsFrom(*this); @@ -1401,8 +1357,6 @@ void PaintLayer::UpdateScrollableArea() { // To clear z-ordering information of overlay overflow controls. if (NeedsReorderOverlayOverflowControls()) DirtyStackingContextZOrderLists(); - if (auto* compositor = Compositor()) - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); } bool PaintLayer::HasOverflowControls() const { @@ -2776,10 +2730,6 @@ ScrollingCoordinator* PaintLayer::GetScrollingCoordinator() { return (!page) ? nullptr : page->GetScrollingCoordinator(); } -bool PaintLayer::CompositesWithTransform() const { - return TransformAncestor() || Transform(); -} - bool PaintLayer::ShouldBeSelfPaintingLayer() const { return GetLayoutObject().LayerTypeRequired() == kNormalPaintLayer || (scrollable_area_ && scrollable_area_->HasOverlayOverflowControls()) || diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h index 4501490463a987..2ac2d73865328b 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.h +++ b/third_party/blink/renderer/core/paint/paint_layer.h @@ -73,7 +73,6 @@ class FilterEffect; class FilterOperations; class HitTestResult; class HitTestingTransformState; -class PaintLayerCompositor; class PaintLayerScrollableArea; class ScrollingCoordinator; class TransformationMatrix; @@ -287,8 +286,6 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, bool IsRootLayer() const { return is_root_layer_; } - PaintLayerCompositor* Compositor() const; - bool UpdateSize(); void UpdateSizeAndScrollingAfterLayout(); @@ -536,9 +533,6 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, // any. Otherwise nullptr. ScrollingCoordinator* GetScrollingCoordinator(); - // Returns true if the element or any ancestor is transformed. - bool CompositesWithTransform() const; - bool PaintsWithTransform(GlobalPaintFlags) const; bool PaintsIntoOwnBacking(GlobalPaintFlags) const; bool PaintsIntoOwnOrGroupedBacking(GlobalPaintFlags) const; @@ -646,10 +640,6 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, void SetNeedsVisualOverflowRecalc(); void SetNeedsCompositingInputsUpdate(bool mark_ancestor_flags = true); - // Notifies the Compositor if one exists that it should rebuild the graphics - // layer tree. - void SetNeedsGraphicsLayerRebuild(); - void UpdateAncestorScrollContainerLayer( const PaintLayer* ancestor_scroll_container_layer) { ancestor_scroll_container_layer_ = ancestor_scroll_container_layer; @@ -660,20 +650,14 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, const gfx::Rect ClippedAbsoluteBoundingBox() const; const gfx::Rect UnclippedAbsoluteBoundingBox() const; - const PaintLayer* OpacityAncestor() const { return nullptr; } - const PaintLayer* TransformAncestor() const { return nullptr; } - const PaintLayer* FilterAncestor() const { return nullptr; } + // TODO(pdr): Remove this. const LayoutBoxModelObject* ClippingContainer() const { return nullptr; } const PaintLayer* AncestorScrollContainerLayer() const { return ancestor_scroll_container_layer_; } + // TODO(pdr): Remove this. const PaintLayer* AncestorScrollingLayer() const { return nullptr; } - const PaintLayer* NearestFixedPositionLayer() const { return nullptr; } const PaintLayer* ScrollParent() const { return nullptr; } - const PaintLayer* ClipParent() const { return nullptr; } - const PaintLayer* NearestContainedLayoutLayer() const { return nullptr; } - const PaintLayer* ClipPathAncestor() const { return nullptr; } - const PaintLayer* MaskAncestor() const { return nullptr; } bool HasFixedPositionDescendant() const { DCHECK(!needs_descendant_dependent_flags_update_); diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index 9a9a6355117deb..c8ab00bc8881cd 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc @@ -94,7 +94,7 @@ #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" +#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_layer_fragment.h" @@ -523,13 +523,9 @@ void PaintLayerScrollableArea::UpdateScrollOffset( frame_view->SetNeedsUpdateGeometries(); } - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - if (auto* scrolling_coordinator = GetScrollingCoordinator()) { - if (!scrolling_coordinator->UpdateCompositorScrollOffset(*frame, *this)) - GetLayoutBox()->GetFrameView()->SetPaintArtifactCompositorNeedsUpdate(); - } - } else { - UpdateCompositingLayersAfterScroll(); + if (auto* scrolling_coordinator = GetScrollingCoordinator()) { + if (!scrolling_coordinator->UpdateCompositorScrollOffset(*frame, *this)) + GetLayoutBox()->GetFrameView()->SetPaintArtifactCompositorNeedsUpdate(); } // The ScrollOffsetTranslation paint property depends on the scroll offset. @@ -2445,44 +2441,6 @@ void PaintLayerScrollableArea::UpdateScrollableAreaSet() { layer_->DidUpdateScrollsOverflow(); } -void PaintLayerScrollableArea::UpdateCompositingLayersAfterScroll() { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - - PaintLayerCompositor* compositor = GetLayoutBox()->View()->Compositor(); - if (!compositor || !compositor->InCompositingMode()) - return; - - if (UsesCompositedScrolling()) { - DCHECK(Layer()->HasCompositedLayerMapping()); - ScrollingCoordinator* scrolling_coordinator = GetScrollingCoordinator(); - bool handled_scroll = scrolling_coordinator && - scrolling_coordinator->UpdateCompositorScrollOffset( - *GetLayoutBox()->GetFrame(), *this); - - if (!handled_scroll) { - compositor->SetNeedsCompositingUpdate( - kCompositingUpdateAfterGeometryChange); - } - - // If we have fixed elements and we scroll the root layer we might - // change compositing since the fixed elements might now overlap a - // composited layer. - if (Layer()->IsRootLayer()) { - LocalFrame* frame = GetLayoutBox()->GetFrame(); - if (frame && frame->View()) { - LocalFrameView* view = frame->View(); - // The maximum possible overlap (for all possible scroll offsets) of the - // fixed content has been included in the overlap test, so we can skip - // the compositing update on scroll changes for fixed content. - // Sticky-pos content still needs a compositing inputs update for - // overlap testing. - if (view->HasStickyViewportConstrainedObject()) - Layer()->SetNeedsCompositingInputsUpdate(); - } - } - } -} - ScrollingCoordinator* PaintLayerScrollableArea::GetScrollingCoordinator() const { LocalFrame* frame = GetLayoutBox()->GetFrame(); diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h index a08299c3f08ed2..3a8b14bbe86875 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h @@ -700,8 +700,6 @@ class CORE_EXPORT PaintLayerScrollableArea final void UpdateScrollableAreaSet(); - void UpdateCompositingLayersAfterScroll(); - ScrollingCoordinator* GetScrollingCoordinator() const; PaintLayerScrollableAreaRareData* RareData() { return rare_data_; } diff --git a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc index fdf79375b7c799..c066b2b4683e34 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc @@ -52,7 +52,6 @@ #include "third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -66,13 +65,6 @@ PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer* layer) DCHECK(layer->GetLayoutObject().IsStackingContext()); } -PaintLayerCompositor* PaintLayerStackingNode::Compositor() const { - DCHECK(layer_->GetLayoutObject().View()); - if (!layer_->GetLayoutObject().View()) - return nullptr; - return layer_->GetLayoutObject().View()->Compositor(); -} - void PaintLayerStackingNode::DirtyZOrderLists() { #if DCHECK_IS_ON() DCHECK(layer_->LayerListMutationAllowed()); @@ -90,9 +82,6 @@ void PaintLayerStackingNode::DirtyZOrderLists() { overlay_overflow_controls_reordered_list_.clear(); z_order_lists_dirty_ = true; - - if (!layer_->GetLayoutObject().DocumentBeingDestroyed() && Compositor()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); } static bool ZIndexLessThan(const PaintLayer* first, const PaintLayer* second) { @@ -318,14 +307,6 @@ bool PaintLayerStackingNode::StyleDidChange(PaintLayer& paint_layer, if (paint_layer.StackingNode()) paint_layer.StackingNode()->DirtyZOrderLists(); - - if (was_stacked != should_be_stacked) { - if (!paint_layer.GetLayoutObject().DocumentBeingDestroyed() && - !paint_layer.IsRootLayer() && paint_layer.Compositor()) { - paint_layer.Compositor()->SetNeedsCompositingUpdate( - kCompositingUpdateRebuildTree); - } - } return true; } diff --git a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h index 041d8e2c28c199..fe72eae6be0bb8 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h +++ b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h @@ -54,7 +54,6 @@ namespace blink { class PaintLayer; -class PaintLayerCompositor; class ComputedStyle; // This class is only for PaintLayer, PaintLayerPaintOrderIterator and @@ -138,8 +137,6 @@ class CORE_EXPORT PaintLayerStackingNode struct HighestLayers; void CollectLayers(PaintLayer&, HighestLayers*); - PaintLayerCompositor* Compositor() const; - Member layer_; // Holds a sorted list of all the descendant nodes within that have z-indices diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 215f4183bc39b5..658df0bd5ea39b 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc @@ -27,7 +27,6 @@ #include "third_party/blink/renderer/core/page/link_highlight.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/cull_rect_updater.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc index 807a61f3c70bdd..f004a76fa76738 100644 --- a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc +++ b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc @@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/page/focus_controller.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/resize_observer/resize_observer.h" diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc index 0bd3c0828159c9..59bd246a963916 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc @@ -564,11 +564,6 @@ sk_sp SVGImage::PaintRecordForCurrentFrame( return view->GetPaintRecord(); } - // TODO(crbug.com/1203406): This works around the bug. We may want to find - // and fix the root cause, or do nothing until pre-CAP code is removed. - if (!view->GetLayoutView() || !view->GetLayoutView()->Compositor()) - return nullptr; - view->UpdateAllLifecyclePhasesExceptPaint(DocumentUpdateReason::kSVGImage); PaintController::CycleScope cycle_scope(*paint_controller_, view->PaintDebugInfoEnabled()); diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index d3b3efb4cd3272..acac2f052d47c1 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc @@ -133,7 +133,6 @@ #include "third_party/blink/renderer/core/page/validation_message_client.h" #include "third_party/blink/renderer/core/page/viewport_description.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/probe/core_probes.h" diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc index 28dc568c1640b0..7dcaab9dcb4b5a 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc @@ -12,7 +12,6 @@ #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h" diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn index 6579fcde9a5fb8..9c2d9c9c2abb76 100644 --- a/third_party/blink/renderer/modules/BUILD.gn +++ b/third_party/blink/renderer/modules/BUILD.gn @@ -281,9 +281,6 @@ group("make_modules_generated") { "//ui/accessibility:ax_enums_mojo_blink_headers", "//ui/display/mojom:mojom_blink_headers", ] - if (is_fuchsia) { - public_deps += [ "//media/fuchsia/mojom:mojom_blink_headers" ] - } } # generate_event_interfaces ---------------------------------------------------- diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder.idl b/third_party/blink/renderer/modules/webcodecs/audio_decoder.idl index 34fbcc65a71c3b..481f5125fde105 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_decoder.idl +++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder.idl @@ -30,8 +30,6 @@ // Set the stream configuration for future decode() requests. // // The next decode request must be for a keyframe. - // - // TODO(chcunningham): Move the keyframe rule into the bytestream registry. [RaisesException] void configure(AudioDecoderConfig config); // Request decoding of an input chunk. @@ -44,10 +42,6 @@ // Resolved after all output for earlier decode requests has been emitted. // // The next decode request must be for a keyframe. - // - // TODO(chcunningham): Consider relaxing the keyframe requirement. - // TODO(chcunningham): Indicate whether the flush() completed successfully or due - // to a reset. [RaisesException] Promise flush(); // Reset all codec state, including all pending requests. diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder_config.idl b/third_party/blink/renderer/modules/webcodecs/audio_decoder_config.idl index 62f7d7d497d15c..bd5490f4972d50 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_decoder_config.idl +++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder_config.idl @@ -8,7 +8,6 @@ // audio_decoder.cc. dictionary AudioDecoderConfig { - // TODO(chcunningham): reference spec registry. required DOMString codec; // Rate of samples per second. 44100, 48000, etc. diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder_config.idl b/third_party/blink/renderer/modules/webcodecs/audio_encoder_config.idl index 8d8f04998a9802..00afe280d2b735 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_encoder_config.idl +++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder_config.idl @@ -7,7 +7,6 @@ // NOTE: Keep this structure in sync with CopyConfig() defined in // audio_encoder.cc. dictionary AudioEncoderConfig { - // TODO(chcunningham): reference spec registry. required DOMString codec; // Rate of samples per second. 44100, 48000, etc. diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_output_callback.idl b/third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_output_callback.idl index 3bfa1434b80f3f..f896a412615b8f 100644 --- a/third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_output_callback.idl +++ b/third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_output_callback.idl @@ -6,4 +6,4 @@ [RuntimeEnabled=WebCodecs] callback EncodedAudioChunkOutputCallback = - void(EncodedAudioChunk output, EncodedAudioChunkMetadata metadata); + void(EncodedAudioChunk output, optional EncodedAudioChunkMetadata metadata = {}); diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_output_callback.idl b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_output_callback.idl index d3d57dd1af76ea..1cb5dc1fa045f2 100644 --- a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_output_callback.idl +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_output_callback.idl @@ -6,4 +6,4 @@ // Handles a new encoded video chunk on the consumer side of the video encoder. callback EncodedVideoChunkOutputCallback = - void (EncodedVideoChunk chunk, EncodedVideoChunkMetadata metadata); \ No newline at end of file + void (EncodedVideoChunk chunk, optional EncodedVideoChunkMetadata metadata = {}); diff --git a/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc index 43cfde69a359d9..b6a44f9ce0a538 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc +++ b/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc @@ -299,6 +299,9 @@ WGPUTextureFormat AsDawnEnum( if (webgpu_enum == "depth24plus-stencil8") { return WGPUTextureFormat_Depth24PlusStencil8; } + if (webgpu_enum == "depth16unorm") { + return WGPUTextureFormat_Depth16Unorm; + } // Block Compression (BC) formats if (webgpu_enum == "bc1-rgba-unorm") { diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl index 7fcb5bedc18ac8..c560a7c7d52261 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl @@ -66,6 +66,7 @@ enum GPUTextureFormat { "depth32float", "depth24plus", "depth24plus-stencil8", + "depth16unorm", /* Block Compression (BC) formats */ "bc1-rgba-unorm", "bc1-rgba-unorm-srgb", diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h index 4cabef1e0a568b..6d4eb4755c689e 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h @@ -111,9 +111,6 @@ class SynthesizedClip : private cc::ContentLayerClient { // // Owns a subtree of the compositor layer tree, and updates it in response to // changes in the paint artifact. -// -// PaintArtifactCompositor is the successor to PaintLayerCompositor, reflecting -// the new home of compositing decisions after paint with CompositeAfterPaint. class PLATFORM_EXPORT PaintArtifactCompositor final : private PropertyTreeManagerClient { USING_FAST_MALLOC(PaintArtifactCompositor); diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc index 53db27382955ed..59e3e620c96b6f 100644 --- a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc +++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc @@ -116,16 +116,18 @@ void StaticBitmapImageToVideoFrameCopier::Convert( // StaticBitmapImages are 8-bit sRGB. Expose the color space and pixel // format that is backing `image->GetMailboxHolder()`, or, alternatively, // expose an accelerated SkImage. - if (accelerated_frame_pool_->CopyRGBATextureToVideoFrame( - viz::SkColorTypeToResourceFormat(kRGBA_8888_SkColorType), - gfx::Size(image->width(), image->height()), - gfx::ColorSpace::CreateSRGB(), - image->IsOriginTopLeft() ? kTopLeft_GrSurfaceOrigin - : kBottomLeft_GrSurfaceOrigin, - image->GetMailboxHolder(), gfx::ColorSpace::CreateREC709(), - std::move(blit_done_callback))) { - return; - } + accelerated_frame_pool_->CopyRGBATextureToVideoFrame( + viz::SkColorTypeToResourceFormat(kRGBA_8888_SkColorType), + gfx::Size(image->width(), image->height()), + gfx::ColorSpace::CreateSRGB(), + image->IsOriginTopLeft() ? kTopLeft_GrSurfaceOrigin + : kBottomLeft_GrSurfaceOrigin, + image->GetMailboxHolder(), gfx::ColorSpace::CreateREC709(), + std::move(blit_done_callback)); + // Early out even if the above fails since it would've already invoked the + // FrameReadyCallback with a null VideoFrame to indicate failure, and that + // will cause us to the take the fallback path in |blit_done_lambda|. + return; } ReadYUVPixelsAsync(image, context_provider->ContextProvider(), std::move(callback)); diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index cd4f6320fd7c7b..dc0ccd592be088 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations @@ -8088,8 +8088,6 @@ crbug.com/894077 [ Linux ] virtual/android/fullscreen/video-fixed-background.htm crbug.com/1271336 external/wpt/native-io/detach_iframe_during_open.https.window.html [ Crash Pass ] crbug.com/1197465 virtual/scroll-unification/fast/events/mouse-cursor-no-mousemove.html [ Skip ] crbug.com/1272017 [ Mac11-arm64 ] virtual/shared_array_buffer_on_desktop/http/tests/devtools/sources/debugger-ui/reveal-not-skipped.js [ Skip ] -crbug.com/1272058 [ Linux ] fast/animation/request-animation-frame-cancel2.html [ Failure Pass ] -crbug.com/1272058 [ Linux ] fast/animation/request-animation-frame-cancel.html [ Failure Pass ] # Sheriff 2021-11-22 crbug.com/1272352 virtual/threaded/http/tests/devtools/isolated-code-cache/same-origin-test.js [ Skip ] diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html b/third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html new file mode 100644 index 00000000000000..6b2f81005d3e41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html @@ -0,0 +1,11 @@ + + +

PASS if no crash or DCHECK failure.

+
+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html new file mode 100644 index 00000000000000..d6180352658a4f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html @@ -0,0 +1,9 @@ + + + +
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-ask-for-reset.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-ask-for-reset.html new file mode 100644 index 00000000000000..002ad83f2d2c39 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-ask-for-reset.html @@ -0,0 +1,119 @@ + + +HTMLSelectMenuElement Test: ask-for-reset + + + +
+ + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-labels.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-labels.tentative.html new file mode 100644 index 00000000000000..fda50b5a3161fa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-labels.tentative.html @@ -0,0 +1,29 @@ + + +HTMLSelectMenuElement Test: labels + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel-expected.txt deleted file mode 100644 index c517c1aab46212..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel-expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -This tests cancelling a requestAnimationFrame callback - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS callbackFired is false -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel.html b/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel.html index c5d4673a4c8572..4e5fe48300147d 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel.html @@ -1,11 +1,20 @@ - - - - - - - - - - +Tests cancelling a requestAnimationFrame callback + + + + diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2-expected.txt deleted file mode 100644 index fbf5aab13b56e3..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2-expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Tests one requestAnimationFrame callback cancelling a second - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS callbackFired is false -PASS cancelFired is true -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2.html b/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2.html index 881087a825bc2d..88ec577e4a961f 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame-cancel2.html @@ -1,11 +1,29 @@ - - - - - - - - - - +Tests one requestAnimationFrame callback cancelling a second + + + + diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-expected.txt deleted file mode 100644 index e469f8f9dc6da2..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Tests basic use of requestAnimationFrame - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS callbackInvoked is true -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix-expected.txt deleted file mode 100644 index d78e002c4b8c02..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix-expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Tests the timestamps provided to prefixed webkitRequestAnimationFrame callbacks - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS legacyFirstTimestamp is >= firstTimestamp -PASS legacySecondTimestamp is >= secondTimestamp -PASS deltaError < 0.001 is true diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix.html b/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix.html index 94dffc50f0b501..fc9c68a5cd7a36 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame-prefix.html @@ -1,11 +1,45 @@ - - - - - - - - - - +Tests the timestamps provided to prefixed webkitRequestAnimationFrame callbacks + + + + diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance-expected.txt deleted file mode 100644 index b9622f3866e54c..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance-expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Tests the timestamps provided to requestAnimationFrame callbacks advance - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS firstTimestamp is defined. -PASS secondTimestamp is defined. -PASS secondTimestamp > firstTimestamp is true -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance.html b/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance.html index ec47e165aae9bb..eaff6cd3e37efb 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-advance.html @@ -1,11 +1,32 @@ - - - - - - - - - - +Tests the timestamps provided to requestAnimationFrame callbacks advance + + + + diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-expected.txt deleted file mode 100644 index 4c37b7c9c4cfaf..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps-expected.txt +++ /dev/null @@ -1,16 +0,0 @@ -Tests the timestamps provided to requestAnimationFrame callbacks - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS firstTimestamp is defined. -PASS secondTimestamp is defined. -PASS firstTimestamp is secondTimestamp -PASS firstTimestamp is defined. -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps.html b/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps.html index b22a03b9ad614c..1b383699410d43 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame-timestamps.html @@ -1,11 +1,39 @@ - - - - - - - - - - +Tests the timestamps provided to requestAnimationFrame callbacks + + + + diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback-expected.txt b/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback-expected.txt deleted file mode 100644 index aab22b58ee7f3a..00000000000000 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback-expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Tests adding one callback within another - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS sameFrame is false -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback.html b/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback.html index eabfae9dd3d6ef..d35e3bd0eeed3e 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame-within-callback.html @@ -1,11 +1,26 @@ - - - - - - - - - - +Tests adding one callback within another + + + + diff --git a/third_party/blink/web_tests/fast/animation/request-animation-frame.html b/third_party/blink/web_tests/fast/animation/request-animation-frame.html index 74505ff49ef9fa..e6580bb414207a 100644 --- a/third_party/blink/web_tests/fast/animation/request-animation-frame.html +++ b/third_party/blink/web_tests/fast/animation/request-animation-frame.html @@ -1,11 +1,13 @@ - - - - - - - - - - +Tests basic use of requestAnimationFrame + + + + diff --git a/third_party/blink/web_tests/fast/animation/script-tests/TEMPLATE.html b/third_party/blink/web_tests/fast/animation/script-tests/TEMPLATE.html deleted file mode 100644 index 9624ad9ba59e91..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/TEMPLATE.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-cancel.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-cancel.js deleted file mode 100644 index 401c97204be7df..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-cancel.js +++ /dev/null @@ -1,19 +0,0 @@ -description("This tests cancelling a requestAnimationFrame callback"); - -var callbackFired = false; -var e = document.getElementById("e"); -var id = window.requestAnimationFrame(function() { - callbackFired = true; -}, e); - -window.cancelAnimationFrame(id); - -window.requestAnimationFrame(function() { - shouldBeFalse("callbackFired"); - isSuccessfullyParsed(); - if (window.testRunner) - testRunner.notifyDone(); -}); - -if (window.testRunner) - testRunner.waitUntilDone(); diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-cancel2.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-cancel2.js deleted file mode 100644 index 080cb67af8f1a6..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-cancel2.js +++ /dev/null @@ -1,26 +0,0 @@ -description("Tests one requestAnimationFrame callback cancelling a second"); - -var e = document.getElementById("e"); -var secondCallbackId; -var callbackFired = false; -var cancelFired = false; - -window.requestAnimationFrame(function() { - cancelFired = true; - window.cancelAnimationFrame(secondCallbackId); -}, e); - -secondCallbackId = window.requestAnimationFrame(function() { - callbackFired = true; -}, e); - -requestAnimationFrame(function() { - shouldBeFalse("callbackFired"); - shouldBeTrue("cancelFired"); - isSuccessfullyParsed(); - if (window.testRunner) - testRunner.notifyDone(); -}); - -if (window.testRunner) - testRunner.waitUntilDone(); diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-disabled.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-disabled.js deleted file mode 100644 index 9c27fa9797a451..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-disabled.js +++ /dev/null @@ -1,19 +0,0 @@ -description("Tests that requestAnimationFrame is disabled when the setting/preference is false. Note: since the setting is true by default, this usually can't be tested directly in a browser."); - -var callbackInvoked = false; -window.requestAnimationFrame(function() { - callbackInvoked = true; -}); - -setTimeout(function() { - shouldBeFalse("callbackInvoked"); -}, 100); - -if (window.testRunner) - testRunner.waitUntilDone(); - -setTimeout(function() { - isSuccessfullyParsed(); - if (window.testRunner) - testRunner.notifyDone(); -}, 200); diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-prefix.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-prefix.js deleted file mode 100644 index eedb0769b850bf..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-prefix.js +++ /dev/null @@ -1,39 +0,0 @@ -description("Tests the timestamps provided to prefixed webkitRequestAnimationFrame callbacks"); - -var firstTimestamp = undefined; -var secondTimestamp = undefined; -var legacyFirstTimestamp = undefined; -var legacySecondTimestamp = undefined; -var deltaError = undefined; - -function busyWait(millis) { - var start = Date.now(); - while (Date.now()-start < millis) {} -} - -window.requestAnimationFrame(function(timestamp) { - firstTimestamp = timestamp; -}); - -window.webkitRequestAnimationFrame(function(timestamp) { - legacyFirstTimestamp = timestamp; - - window.requestAnimationFrame(function(timestamp) { - secondTimestamp = timestamp; - }); - - window.webkitRequestAnimationFrame(function(timestamp) { - legacySecondTimestamp = timestamp; - - shouldBeGreaterThanOrEqual("legacyFirstTimestamp", "firstTimestamp"); - shouldBeGreaterThanOrEqual("legacySecondTimestamp", "secondTimestamp"); - deltaError = Math.abs((legacySecondTimestamp - legacyFirstTimestamp) - (secondTimestamp - firstTimestamp)); - shouldBeTrue("deltaError < 0.001"); - testRunner.notifyDone(); - }); - - busyWait(10); -}); - -if (window.testRunner) - testRunner.waitUntilDone(); diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-timestamps-advance.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-timestamps-advance.js deleted file mode 100644 index e995ce72d9a1d6..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-timestamps-advance.js +++ /dev/null @@ -1,23 +0,0 @@ -jsTestIsAsync = true; - -description("Tests the timestamps provided to requestAnimationFrame callbacks advance"); - -function busyWait(millis) { - var start = Date.now(); - while (Date.now()-start < millis) {} -} - -var firstTimestamp = undefined; -var secondTimestamp = undefined; - -window.requestAnimationFrame(function(timestamp) { - firstTimestamp = timestamp; - shouldBeDefined("firstTimestamp"); - window.requestAnimationFrame(function(timestamp) { - secondTimestamp = timestamp; - shouldBeDefined("secondTimestamp"); - shouldBeTrue("secondTimestamp > firstTimestamp"); - finishJSTest(); - }); - busyWait(10); -}); diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-timestamps.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-timestamps.js deleted file mode 100644 index bd2764d549f7f8..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-timestamps.js +++ /dev/null @@ -1,31 +0,0 @@ -description("Tests the timestamps provided to requestAnimationFrame callbacks"); - -function busyWait(millis) { - var start = Date.now(); - while (Date.now()-start < millis) {} -} - -var firstTimestamp = undefined; - -window.requestAnimationFrame(function(timestamp) { - firstTimestamp = timestamp; - shouldBeDefined("firstTimestamp"); - busyWait(10); -}); - -var secondTimestamp = undefined; -window.requestAnimationFrame(function(timestamp) { - secondTimestamp = timestamp; - shouldBeDefined("secondTimestamp"); - shouldBe("firstTimestamp", "secondTimestamp"); -}); - -if (window.testRunner) - testRunner.waitUntilDone(); - -requestAnimationFrame(function() { - shouldBeDefined("firstTimestamp"); - isSuccessfullyParsed(); - if (window.testRunner) - testRunner.notifyDone(); -}); diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-within-callback.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-within-callback.js deleted file mode 100644 index 72886d8f5c241a..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame-within-callback.js +++ /dev/null @@ -1,24 +0,0 @@ -description("Tests adding one callback within another"); - -var e = document.getElementById("e"); -var sameFrame; -window.requestAnimationFrame(function() { - sameFrame = true; -}, e); -window.requestAnimationFrame(function() { - window.requestAnimationFrame(function() { - shouldBeFalse("sameFrame"); - }, e); - requestAnimationFrame(function() { - isSuccessfullyParsed(); - if (window.testRunner) - testRunner.notifyDone(); - }); -}, e); -window.requestAnimationFrame(function() { - sameFrame = false; -}, e); - -if (window.testRunner) - testRunner.waitUntilDone(); - diff --git a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame.js b/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame.js deleted file mode 100644 index caa1fb3a0d6710..00000000000000 --- a/third_party/blink/web_tests/fast/animation/script-tests/request-animation-frame.js +++ /dev/null @@ -1,14 +0,0 @@ -description("Tests basic use of requestAnimationFrame"); - -var e = document.getElementById("e"); -var callbackInvoked = false; -window.requestAnimationFrame(function() { - callbackInvoked = true; - shouldBeTrue("callbackInvoked"); - isSuccessfullyParsed(); - if (window.testRunner) - testRunner.notifyDone(); -}, e); - -if (window.testRunner) - testRunner.waitUntilDone(); diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt index 4779f44b4f2607..ecb1f5261974a4 100644 --- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt @@ -979,6 +979,7 @@ html element select html element selectmenu property checkValidity property form + property labels property name property open property reportValidity diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 6f4f43eedd5d7b..1baf18c7264390 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt @@ -4258,6 +4258,7 @@ interface HTMLSelectElement : HTMLElement interface HTMLSelectMenuElement : HTMLElement attribute @@toStringTag getter form + getter labels getter name getter open getter required diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py index 3479e720ce1af2..a4cba919cc0315 100755 --- a/tools/clang/scripts/build.py +++ b/tools/clang/scripts/build.py @@ -289,14 +289,11 @@ def BuildLibXml2(): # $ gsutil cp -n -a public-read libxml2-$VER.tar.gz \ # gs://chromium-browser-clang/tools - # TODO(thakis): Use this locally built statically linked libxml2 on all - # platforms. fewer dynamic deps, and guaranteed(ish) to have same behavior - # across platforms. - - libxml2_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'libxml2-v2.9.12') + libxml2_version = 'libxml2-v2.9.12' + libxml2_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, libxml2_version) if os.path.exists(libxml2_dir): RmTree(libxml2_dir) - zip_name = 'libxml2-v2.9.12.tar.gz' + zip_name = libxml2_version + '.tar.gz' DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR) os.chdir(libxml2_dir) os.mkdir('build') @@ -306,12 +303,18 @@ def BuildLibXml2(): # Disable everything except WITH_TREE and WITH_OUTPUT, both needed by LLVM's # WindowsManifestMerger. + # Also enable WITH_THREADS, else libxml doesn't compile on Linux. RunCommand( [ 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_INSTALL_PREFIX=install', + # The mac_arm bot builds a clang arm binary, but currently on an intel + # host. If we ever move it to run on an arm mac, this can go. We + # could pass this only if args.build_mac_arm, but libxml is small, so + # might as well build it universal always for a few years. + '-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64', '-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded', # /MT to match LLVM. '-DBUILD_SHARED_LIBS=OFF', '-DLIBXML2_WITH_C14N=OFF', @@ -340,7 +343,7 @@ def BuildLibXml2(): '-DLIBXML2_WITH_SCHEMAS=OFF', '-DLIBXML2_WITH_SCHEMATRON=OFF', '-DLIBXML2_WITH_TESTS=OFF', - '-DLIBXML2_WITH_THREADS=OFF', + '-DLIBXML2_WITH_THREADS=ON', '-DLIBXML2_WITH_THREAD_ALLOC=OFF', '-DLIBXML2_WITH_TREE=ON', '-DLIBXML2_WITH_VALID=OFF', @@ -355,7 +358,10 @@ def BuildLibXml2(): RunCommand(['ninja', 'install'], msvc_arch='x64') libxml2_include_dir = os.path.join(libxml2_install_dir, 'include', 'libxml2') - libxml2_lib = os.path.join(libxml2_install_dir, 'lib', 'libxml2s.lib') + if sys.platform == 'win32': + libxml2_lib = os.path.join(libxml2_install_dir, 'lib', 'libxml2s.lib') + else: + libxml2_lib = os.path.join(libxml2_install_dir, 'lib', 'libxml2.a') extra_cmake_flags = [ '-DLLVM_ENABLE_LIBXML2=FORCE_ON', '-DLIBXML2_INCLUDE_DIR=' + libxml2_include_dir.replace('\\', '/'), @@ -704,19 +710,17 @@ def main(): cxxflags.append('-I' + zlib_dir) ldflags.append('-LIBPATH:' + zlib_dir) - # Statically link libxml2 to make lld-link not require mt.exe - libxml_cmake_args, libxml_cflags = BuildLibXml2() - base_cmake_args += libxml_cmake_args - cflags += libxml_cflags - cxxflags += libxml_cflags - # Use rpmalloc. For faster ThinLTO linking. rpmalloc_dir = DownloadRPMalloc() base_cmake_args.append('-DLLVM_INTEGRATED_CRT_ALLOC=' + rpmalloc_dir) - if sys.platform != 'win32': - # libxml2 is required by the Win manifest merging tool used in cross-builds. - base_cmake_args.append('-DLLVM_ENABLE_LIBXML2=FORCE_ON') + # Statically link libxml2 to make lld-link not require mt.exe on Windows, + # and to make sure lld-link output on other platforms is identical to + # lld-link on Windows (for cross-builds). + libxml_cmake_args, libxml_cflags = BuildLibXml2() + base_cmake_args += libxml_cmake_args + cflags += libxml_cflags + cxxflags += libxml_cflags if args.bootstrap: print('Building bootstrap compiler') diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index afc5a5d337b93d..b49babbfd5888f 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py @@ -35,7 +35,7 @@ # Reverting problematic clang rolls is safe, though. # This is the output of `git describe` and is usable as a commit-ish. CLANG_REVISION = 'llvmorg-14-init-12246-g7787a8f1' -CLANG_SUB_REVISION = 1 +CLANG_SUB_REVISION = 2 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) RELEASE_VERSION = '14.0.0' diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b75dda8258831a..fecce9cbb5120e 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -8458,6 +8458,14 @@ Called by update_bad_message_reasons.py.--> + + + + + + + + @@ -36125,6 +36133,15 @@ Called by update_permissions_policy_enum.py.--> + + + + + + + + @@ -36147,6 +36164,8 @@ Called by update_permissions_policy_enum.py.--> + + @@ -46646,6 +46665,19 @@ Called by update_gpu_driver_bug_workaround_entries.py.--> + + + Captures errors codes that can be given by + JSONFileValueDeserializer::Deserialize(). + + + + + + + + + @@ -50614,6 +50646,7 @@ from previous Chrome versions. + @@ -50752,6 +50785,7 @@ from previous Chrome versions. label="VmCameraMicIndicatorsAndNotifications:enabled"/> + diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index c63a1956d35e3f..f21ece62ebbd09 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml @@ -3807,7 +3807,7 @@ chromium-metrics-reviews@google.com. + expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3819,7 +3819,7 @@ chromium-metrics-reviews@google.com. + enum="AndroidWebViewCrashCollectionState" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3834,7 +3834,7 @@ chromium-metrics-reviews@google.com. + enum="AndroidWebViewCrashInteraction" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3851,7 +3851,7 @@ chromium-metrics-reviews@google.com. + units="crash reports" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3864,7 +3864,7 @@ chromium-metrics-reviews@google.com. + expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3877,7 +3877,7 @@ chromium-metrics-reviews@google.com. + enum="BooleanEnabled" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3889,7 +3889,7 @@ chromium-metrics-reviews@google.com. + expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3902,7 +3902,7 @@ chromium-metrics-reviews@google.com. + enum="Boolean" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3917,7 +3917,7 @@ chromium-metrics-reviews@google.com. + enum="AndroidWebViewDevUiFragments" expires_after="2022-12-14"> @@ -3945,7 +3945,7 @@ chromium-metrics-reviews@google.com. + enum="AndroidWebViewDevUiMenu" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3956,7 +3956,7 @@ chromium-metrics-reviews@google.com. + enum="BooleanEnabled" expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS @@ -3971,7 +3971,7 @@ chromium-metrics-reviews@google.com. + expires_after="2022-12-14"> @@ -3984,7 +3984,7 @@ chromium-metrics-reviews@google.com. + expires_after="2022-12-14"> ntfschr@chromium.org hazems@chromium.org src/android_webview/OWNERS diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml index 8c62c8a5191e8b..be8d52b9b6ef04 100644 --- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml +++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml @@ -245,6 +245,18 @@ chromium-metrics-reviews@google.com. + + shanefitz@google.com + julietlevesque@google.com + chromeos-cross-device-eng@google.com + + Records success or failure of creating a Gatt connection during the Fast + Pair pairing protocol. Emitted following the attempted creation of the Gatt + service client during the key based pairing exchange. + + + shanefitz@google.com diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml index 4efd25cf297197..4a4a222e63881a 100644 --- a/tools/metrics/histograms/metadata/language/histograms.xml +++ b/tools/metrics/histograms/metadata/language/histograms.xml @@ -90,6 +90,21 @@ chromium-metrics-reviews@google.com. + + perrier@chromium.org + chrome-language@google.com + + Whether or not accessibility features are enabled when the App Language + Prompt should be shown. If accessibility features are enabled the prompt + will not be shown. This histogram will continue to log "Enabled" + for the user until Chrome is started with accessibility features disabled. + + Reported each time all other conditions for showing the App Language Prompt + have been met. + + + perrier@chromium.org diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml index fa298aed0a0620..dc74ed907bc5e4 100644 --- a/tools/metrics/histograms/metadata/optimization/histograms.xml +++ b/tools/metrics/histograms/metadata/optimization/histograms.xml @@ -393,6 +393,17 @@ chromium-metrics-reviews@google.com. + + sophiechang@chromium.org + mcrouse@chromium.org + + The number of active batch update hints fetches initiated by the hints + manager. Recorded when a fetch is initiated to the remote Optimization Guide + Service for a batch update context (i.e. on SRP, other UI surfaces, etc.). + + + diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index c64f5dadbf09b5..ea3d87550be49d 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml @@ -6465,6 +6465,25 @@ chromium-metrics-reviews@google.com. + + xiangdongkong@google.com + cros-feedback-app@google.com + + Records whether the user is online when the feedback report was submitted. + + + + + xiangdongkong@google.com + cros-feedback-app@google.com + + Records the feedback report sending states to help track the success rate of + feedback report offline submission. + + + afakhry@chromium.org diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml index b3ca4591c62097..844f3760bbf2b6 100644 --- a/tools/metrics/histograms/metadata/variations/histograms.xml +++ b/tools/metrics/histograms/metadata/variations/histograms.xml @@ -76,8 +76,40 @@ chromium-metrics-reviews@google.com. + + caitlinfischer@google.com + src/base/metrics/OWNERS + Internals>Metrics>Variations + + The error code given by JSONFileValueDeserializer::Deserialize(). Emitted + during CleanExitBeacon initialization when the beacon file cannot be + deserialized. In other words, it is emitted whenever the "Not + deserializable" bucket of the BeaconFileStateAtStartup histogram is + emitted. Note that this file is used by only one branch of the Extended + Variations Safe Mode experiment. + + + + + caitlinfischer@google.com + src/base/metrics/OWNERS + Internals>Metrics>Variations + + The state of the beacon file and its contents, e.g. readable or not + deserializable. See the BeaconFileDeserializationError histogram for more + details on why the file was not deserializable. Note that this file is used + by only one branch of the Extended Variations Safe Mode experiment. Recorded + when the CleanExitBeacon is initialized. + + + + + Replaced with Variations.ExtendedSafeMode.BeaconFileState in M99. + caitlinfischer@google.com src/base/metrics/OWNERS Internals>Metrics>Variations @@ -86,7 +118,7 @@ chromium-metrics-reviews@google.com. This is the case when the file exists, its contents are successfully read, and its contents are non-empty and in the expected format. Note that this file is used by only one branch of the Extended Variations Safe Mode - experiment. Recorded when the CleanExitBeacon is constructed. + experiment. Recorded when the CleanExitBeacon is initialized. diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index f8ee8ee14f980a..0a5bd4079fed69 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json @@ -5,8 +5,8 @@ "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "868d915a84fb4661b6fcb2c374cc270ba5578370", - "remote_path": "perfetto_binaries/trace_processor_shell/win/9c674c8ed6844fb88b545a8df9282a9405f8a072/trace_processor_shell.exe" + "hash": "083528a13c67adcf55a6cd1d79ec4980e526638a", + "remote_path": "perfetto_binaries/trace_processor_shell/win/cefb3e0ec3a0580c996f801e854fe02963c03d5c/trace_processor_shell.exe" }, "mac": { "hash": "83a92c4b88f963f5606a1e3c953d2051b0cb1958", @@ -17,8 +17,8 @@ "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "linux": { - "hash": "def284ce32dd30683650ebe712d279573ff15359", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/9c674c8ed6844fb88b545a8df9282a9405f8a072/trace_processor_shell" + "hash": "9e5e4909b2b6a6f4e1aeb2b5bc081567935aeea0", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/cefb3e0ec3a0580c996f801e854fe02963c03d5c/trace_processor_shell" } }, "power_profile.sql": { diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn index d3f8da79299dd6..4ce1e31d3b4637 100644 --- a/ui/aura/BUILD.gn +++ b/ui/aura/BUILD.gn @@ -31,6 +31,7 @@ component("aura") { "env_input_state_controller.h", "env_observer.h", "event_injector.h", + "host_frame_rate_throttler.h", "input_state_lookup.h", "layout_manager.h", "null_window_targeter.h", @@ -73,6 +74,7 @@ component("aura") { "env.cc", "env_input_state_controller.cc", "event_injector.cc", + "host_frame_rate_throttler.cc", "input_state_lookup.cc", "layout_manager.cc", "native_window_occlusion_tracker.cc", diff --git a/ui/aura/host_frame_rate_throttler.cc b/ui/aura/host_frame_rate_throttler.cc new file mode 100644 index 00000000000000..68284254e7a4d3 --- /dev/null +++ b/ui/aura/host_frame_rate_throttler.cc @@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/aura/host_frame_rate_throttler.h" + +#include "base/containers/contains.h" +#include "components/viz/common/surfaces/frame_sink_id.h" +#include "components/viz/host/host_frame_sink_manager.h" +#include "ui/aura/env.h" +#include "ui/aura/window_tree_host.h" +#include "ui/compositor/compositor.h" + +namespace aura { + +constexpr uint8_t kDefaultThrottleFps = 1; + +HostFrameRateThrottler& HostFrameRateThrottler::GetInstance() { + static base::NoDestructor instance; + return *instance; +} + +HostFrameRateThrottler::HostFrameRateThrottler() = default; + +HostFrameRateThrottler::~HostFrameRateThrottler() = default; + +void HostFrameRateThrottler::AddHost(WindowTreeHost* host) { + if (base::Contains(hosts_, host)) + return; + hosts_.insert(host); + UpdateHostFrameSinkManager(); +} + +void HostFrameRateThrottler::RemoveHost(WindowTreeHost* host) { + if (!base::Contains(hosts_, host)) + return; + hosts_.erase(host); + UpdateHostFrameSinkManager(); +} + +void HostFrameRateThrottler::UpdateHostFrameSinkManager() { + std::vector ids; + ids.reserve(hosts_.size()); + for (WindowTreeHost* host : hosts_) + ids.push_back(host->compositor()->frame_sink_id()); + Env::GetInstance()->context_factory()->GetHostFrameSinkManager()->Throttle( + ids, base::Hertz(kDefaultThrottleFps)); +} + +} // namespace aura diff --git a/ui/aura/host_frame_rate_throttler.h b/ui/aura/host_frame_rate_throttler.h new file mode 100644 index 00000000000000..1dda8683cf801d --- /dev/null +++ b/ui/aura/host_frame_rate_throttler.h @@ -0,0 +1,40 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_AURA_HOST_FRAME_RATE_THROTTLER_H_ +#define UI_AURA_HOST_FRAME_RATE_THROTTLER_H_ + +#include "base/containers/flat_set.h" +#include "base/no_destructor.h" +#include "ui/aura/aura_export.h" + +namespace aura { + +class WindowTreeHost; + +// Used to throttle the frame rate of hosts that are occluded. +class AURA_EXPORT HostFrameRateThrottler { + public: + static HostFrameRateThrottler& GetInstance(); + + void AddHost(WindowTreeHost* host); + void RemoveHost(WindowTreeHost* host); + + const base::flat_set& hosts() const { return hosts_; } + + private: + friend class base::NoDestructor; + + HostFrameRateThrottler(); + ~HostFrameRateThrottler(); + + void UpdateHostFrameSinkManager(); + + // Set of hosts that are currently throttled. + base::flat_set hosts_; +}; + +} // namespace aura + +#endif // UI_AURA_HOST_FRAME_RATE_THROTTLER_H_ diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc index 1be963ce0c594a..f21e88c22e789d 100644 --- a/ui/aura/window_tree_host.cc +++ b/ui/aura/window_tree_host.cc @@ -22,6 +22,7 @@ #include "ui/aura/client/capture_client.h" #include "ui/aura/client/cursor_client.h" #include "ui/aura/env.h" +#include "ui/aura/host_frame_rate_throttler.h" #include "ui/aura/native_window_occlusion_tracker.h" #include "ui/aura/scoped_keyboard_hook.h" #include "ui/aura/scoped_simple_keyboard_hook.h" @@ -94,49 +95,6 @@ class ScopedLocalSurfaceIdValidator { }; #endif -// Used to throttle the frame rate of hosts that are occluded. -class HostThrottler { - public: - static HostThrottler& GetInstance() { - static base::NoDestructor instance; - return *instance; - } - - void AddHost(WindowTreeHost* host) { - if (base::Contains(hosts_, host)) - return; - hosts_.insert(host); - UpdateHostFrameSinkManager(); - } - - void RemoveHost(WindowTreeHost* host) { - if (!base::Contains(hosts_, host)) - return; - hosts_.erase(host); - UpdateHostFrameSinkManager(); - } - - const base::flat_set& hosts() const { return hosts_; } - - private: - friend class base::NoDestructor; - - HostThrottler() = default; - ~HostThrottler() = default; - - void UpdateHostFrameSinkManager() { - std::vector ids; - ids.reserve(hosts_.size()); - for (WindowTreeHost* host : hosts_) - ids.push_back(host->compositor()->frame_sink_id()); - Env::GetInstance()->context_factory()->GetHostFrameSinkManager()->Throttle( - ids, base::Seconds(1)); - } - - // Set of hosts that are currently throttled. - base::flat_set hosts_; -}; - } // namespace // In order for viz to drop all references to resources used by the browser @@ -468,9 +426,9 @@ void WindowTreeHost::SetNativeWindowOcclusionState( if (ShouldThrottleWhenOccluded()) { // Throttling doesn't update the visibility. if (occlusion_state_ == Window::OcclusionState::OCCLUDED) - HostThrottler::GetInstance().AddHost(this); + HostFrameRateThrottler::GetInstance().AddHost(this); else - HostThrottler::GetInstance().RemoveHost(this); + HostFrameRateThrottler::GetInstance().RemoveHost(this); } else { const bool visible = CalculateCompositorVisibilityFromOcclusionState(); // Transitioning to hidden means the compositor state hasn't been updated @@ -570,7 +528,7 @@ void WindowTreeHost::UpdateCompositorVisibility(bool visible) { // disabled. For the most part, if ShouldThrottleWhenOccluded() is true, // the handling of occlusion changing is done in // SetNativeWindowOcclusionState(). - HostThrottler::GetInstance().RemoveHost(this); + HostFrameRateThrottler::GetInstance().RemoveHost(this); } if (visible) { @@ -593,7 +551,7 @@ void WindowTreeHost::DestroyCompositor() { return; if (ShouldThrottleWhenOccluded()) - HostThrottler::GetInstance().RemoveHost(this); + HostFrameRateThrottler::GetInstance().RemoveHost(this); // Explicitly delete the HideHelper early as it makes use of `compositor_` // and `window_`. @@ -859,7 +817,7 @@ void WindowTreeHost::FinishHideTransition() { // static const base::flat_set& WindowTreeHost::GetThrottledHostsForTesting() { - return HostThrottler::GetInstance().hosts(); + return HostFrameRateThrottler::GetInstance().hosts(); } void WindowTreeHost::StartReleasingResourcesForHide() { diff --git a/ui/base/glib/glib_cast.h b/ui/base/glib/glib_cast.h index da550e017f5a10..1c226fa436b080 100644 --- a/ui/base/glib/glib_cast.h +++ b/ui/base/glib/glib_cast.h @@ -13,7 +13,8 @@ template T* GlibCast(U* instance, GType g_type) { // Ensure |g_type| is used so the compiler doesn't optimize it away // in release builds. - g_type_class_unref(g_type_class_ref(g_type)); + if (auto* type_class = g_type_class_ref(g_type)) + g_type_class_unref(type_class); DCHECK(G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)); return reinterpret_cast(instance); } diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc index 5ed1c10ec0aa73..60bcc26cb0532c 100644 --- a/weblayer/browser/content_browser_client_impl.cc +++ b/weblayer/browser/content_browser_client_impl.cc @@ -489,12 +489,6 @@ void ContentBrowserClientImpl::OnNetworkServiceCreated( if (!SystemNetworkContextManager::HasInstance()) SystemNetworkContextManager::CreateInstance( embedder_support::GetUserAgent()); -// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is -// complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) - network::mojom::CryptConfigPtr config = network::mojom::CryptConfig::New(); - content::GetNetworkService()->SetCryptConfig(std::move(config)); -#endif SystemNetworkContextManager::GetInstance()->OnNetworkServiceCreated( network_service); }